在LeetCode上做题1

    科技2023-09-15  82

    在LeetCode上做题。

    题目:

    求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例 1:

    输入: n = 3 输出: 6 示例 2:

    输入: n = 9 输出: 45

    限制:

    1 <= n <= 10000

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/qiu-12n-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题方法: 1.还是用递归做题,用逻辑运算符的短路性质代替if语句的作用。 2.用乘法完成,可以用加法和位运算模拟乘法,这个是叫俄罗斯农民算法。

    代码:

    代码1

    class Solution { public: int sumNums(int n) { n && (n+=sumNums(n-1)); return n; } };

    代码2

    这个我是直接复制过来的,LeetCode的官方答案,我还没看明白,明天再看看,力图自己可以写出来。

    class Solution { public: int sumNums(int n) { int ans = 0, A = n, B = n + 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; (B & 1) && (ans += A); A <<= 1; B >>= 1; return ans >> 1; } };

    作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/qiu-12n-lcof/solution/qiu-12n-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    知识点 1.逻辑运算符的短路性质: 就是&&和||,对于A&&B,前面的是false,整个表达式就是false,所以B就不判断了,可以用来断掉递归。比如这句n && (n+=sumNums(n-1)); 会一直递归,直到n是0了,也就相当于false了,由于这个短路性质,后面那个表达式就直接跳过了,就不会进入递归了。 2.俄罗斯农民算法:(不太明白,明天有时间再看看,然后自己写一写理解,先贴个链接。)

    这个是博客园的,感觉写到很详细,可以点开细看

    Processed: 0.014, SQL: 8