LeetCode-Algorithms-[Mid][逻辑运算][位运算]面试题64. 求1+2+…+n

LeetCode-Algorithms-[Mid][逻辑运算][位运算]面试题64. 求1+2+…+n_第1张图片

敲重点:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

可以用两种解法:官方题解

 

方法二是根据官方思路重新封装过的代码,冗余代码真的看得浑身难受

附方法二的原理俄罗斯农民乘法

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

    public int sumNums_2(int n) {
        dataHelper data = new dataHelper(n, n + 1, 0);

        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);
        data = turn(data);

        return data.res >> 1;
    }

    private dataHelper turn(dataHelper data) {
        boolean flag = isOdd(data.a) && (data.res += data.b) > 0;
        data.a >>= 1;
        data.b <<= 1;
        return data;
    }

    private class dataHelper {
        int a;
        int b;
        int res;

        public dataHelper(int _a, int _b, int _res) {
            this.a = _a;
            this.b = _b;
            this.res = _res;
        }
    }

    private boolean isOdd(int num) {
        return (num & 1) == 1;
    }

 

你可能感兴趣的:(LeetCode)