PROBLEM

剑指 Offer 64. 求1+2+…+n

难度 中等

MY ANSWER

使用&&来结束递归,时间空间复杂度都为O(n)。

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

BETTER SOLUTION

题目对n进行了范围限制,所以可以手动展开进行二进制乘法运算,时间复杂度为O(logn),空间复杂度O(1)。

乘法原理为:1011 * 101 = 1011 * 100 + 1011 * 1 = 55。同样使用&&进行条件判断。

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

SUMMARY

  • 使用&&的短路效应(前面为假不进行后面的操作)来进行条件判断
  • 通过位运算实现二进制乘法