• [leetCode]面试题64. 求1+2+······+n


    在这里插入图片描述
    如果抛开本题的前提条件,直接用递归可以按以下方式求解:

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

    但是题目有限制,因此剩余的工具只有加减法赋值位运算符以及逻辑运算符

    解法一 递归

    利用逻辑运算符的"短路"性质来作为递归的出口。以 &&为例,在表达式A && B中,当A为false时整个表达式为false,B不会执行,因此A可以看作递归出口,B可以看作递归函数主体:

    使用&&

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

    使用||

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

    解法二 快速乘

    由于不能使用乘除法,但是我们可以使用移位运算符与加减法来模拟"二进制乘法"。二进制乘法求解过程如下图所示:
    在这里插入图片描述
    我们111作为A,1011作为B,A与B相乘可以看作"加法"与"移位"。如果B的第i位(i=0,1,2,3)为1则A对结果的贡献为A<<i,因此可以通过以下代码来实现该乘法:

    int quickMuliti(int A, int B){
            int ans = 0;
            for(;B;B>>=1){
                if(B & 1){//判断B二进制的最低位是否是1
                    ans+=A;
                }
                A<<=1;
            }
            return ans;
    }
    

    回到本题,我们知道1+2+...n=(n+1)n/2除法可以使用右移一位代替,那么等式就变成了(n+1)n>>2,最后(n+1)n可以用上面的快速乘来代替乘法,但是上面的代码有for语句,而题目中n的范围为[1-10000]所以n不会超过14位(10000转化为二进制为10011100010000),因此可以利用逻辑运算符的短路性质和移位运算符手动模拟乘法:

    c++

    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;
        }
    };
    

    java

    class Solution {
        public int sumNums(int n) {
            int ans = 0, A = n, B = n + 1;
            boolean flag;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            flag = (B & 1)>0 && (ans+=A)>0;
            A<<=1;
            B>>=1;
    
            return ans>>1;
        } 
    }
    
  • 相关阅读:
    2022918 #29 愿灰飞烟灭 我的每个昨天
    2022917 #28 请允许我独自探访这场戏的结局
    2022911/12 #27 自弹 自唱 自赏 不如自封为王
    2022912 #26 新的开始
    EBS:导入弹性域关键字的值(FND_FLEX_LOADER_APIS.up_value_set_value)
    EBS:已知科目组合ID,查询科目组合值
    EBS:值集获取段限定词SQL
    EBS:资产期间状态查询
    Oracle Linux 7u2 启动错误 XFS_WANT_CORRUPTED_GOTO
    EBS:事物处理活动TRANSACTION_ACTION_ID
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860037.html
Copyright © 2020-2023  润新知