愚人节快乐,今天又是倒霉的一天。想去学校健身房健身,结果今天健身房体育课加课,不让进。想回宿舍洗衣服,吃完饭再回实验室,结果老师第一次没微信联系我,直接去实验室找我。。而我此时在宿舍。。。还好师哥帮忙圆了一下,我又火急火燎的去了老师办公室。。。
算了,不说废话了,下面是今天的每日一题,我用的是笨方法做的,然后后面补充一个大佬的代码,都是写“奇技淫巧”的套路,服了服了
解题思路
因为很简单就可以看出,算法的细节就是从给定的N开始递减,遵循 ×、/、+、-的顺序对每个数字进行运算。对所有的数字从index = 1开始标注索引,所以对每个索引值满足index%N=0的数字都是进行加法操作,而对于index%N=1,2分别进行的是 -、× 和 /。 每当除法执行完之后,不需要对当前的结果进行保存,所以直接添加到ans中,n重置为0。
对于那些 N%4 != 0的N,当i的值为1时,直接把当前的n值加入ans中。因为n在每次与ans相加后都会重置为0,所以对N%4 = 0的情况下,进行重复相加也不会对结果造成影响。
代码
class Solution {
public int clumsy(int N) {
int ans = 0; //存储答案
int index = 1; // 用于计数
int i = N;
int n = 0; // 用来临时存储乘法和除法的值
int s = 1; // 用于进行"+"和"-"的转化
while(index <= N)
{
switch(index % 4)
{
case 0 : ans+=i;break;
case 1 : n = i;break;
case 2 : n = n * i;break;
case 3 : n = n / i; ans = ans+ s*n; n=0; s = -1;break;
default:break;
}
if(i > 1)
{
i --;
}
else{
ans= ans + s*n;
}
index++;
}
return ans;
}
}
大佬的解题思路:
打印N为1-1000的结果,可以发现,除了前面几个之外,后面的结果值与索引的插值满足规律[1,2,2,-1],所以可以利用这个规律来进行解题,时间复杂度为O(1),而上面的算法为O(n)。
1->1 = 0
2->2 = 0
3->6 = 3
4->7 = 3
5->7 = 2
6->8 = 2
7->6 = -1
8->9 = 1
9->11 = 2
10->12 = 2
11->10 = -1
12->13 = 1
13->15 = 2
14->16 = 2
15->14 = -1
16->17 = 1
17->19 = 2
18->20 = 2
19->18 = -1
20->21 = 1
21->23 = 2
22->24 = 2
23->22 = -1
24->25 = 1
25->27 = 2
26->28 = 2
27->26 = -1
28->29 = 1
29->31 = 2
30->32 = 2
31->30 = -1
32->33 = 1
33->35 = 2
34->36 = 2
35->34 = -1
36->37 = 1
37->39 = 2
38->40 = 2
39->38 = -1
40->41 = 1
41->43 = 2
42->44 = 2
43->42 = -1
44->45 = 1
45->47 = 2
46->48 = 2
47->46 = -1
48->49 = 1
49->51 = 2
50->52 = 2
51->50 = -1
52->53 = 1
53->55 = 2
54->56 = 2
55->54 = -1
56->57 = 1
57->59 = 2
58->60 = 2
59->58 = -1
60->61 = 1
61->63 = 2
62->64 = 2
63->62 = -1
代码
class Solution {
public int clumsy(int n) {
int[] special = new int[]{1,2,6,7};
int[] diff = new int[]{1,2,2,-1};
if (n <= 4) return special[(n - 1) % 4];
return n + diff[n % 4];
}
}