Leetcode---1006笨阶乘 愚人节的我也是笨比

愚人节快乐,今天又是倒霉的一天。想去学校健身房健身,结果今天健身房体育课加课,不让进。想回宿舍洗衣服,吃完饭再回实验室,结果老师第一次没微信联系我,直接去实验室找我。。而我此时在宿舍。。。还好师哥帮忙圆了一下,我又火急火燎的去了老师办公室。。。
算了,不说废话了,下面是今天的每日一题,我用的是笨方法做的,然后后面补充一个大佬的代码,都是写“奇技淫巧”的套路,服了服了
在这里插入图片描述

解题思路
因为很简单就可以看出,算法的细节就是从给定的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];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值