剑指 Offer 64. 求1+2+…+n
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 64. 求1+2+…+n相关的知识,希望对你有一定的参考价值。
题目链接: 剑指 Offer 64. 求1+2+…+n
有关题目
求 1+2+...+n ,要求不能使用乘除法、for、while、if、
else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
题解
方法一:递归
逻辑运算符,短路原理
代码一:
//逻辑与
int sumNums(int n){
n && (n += sumNums(n - 1));
return n;
}
代码二:
//逻辑或
int sumNums(int n){
!n || (n += sumNums(n - 1));
return n;
}
法二:快速幂(俄罗斯农民乘法)
A * B利用加法和位运算来模拟
int quickMulti(int A, int B) {
int ans = 0;
for ( ; B; B >>= 1) {
if (B & 1) {
ans += A;
}
A <<= 1;
}
return ans;
}
代码一:手动循环版本
题目给定的n的范围为[1, 10000]
2 ^ 14 = 16,384
故最多循环14次
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;
}
};
代码二:递归版本
ans = (a & -(b & 1)) + quickMulti(a << 1, b >> 1)
-(b & 1) 这个只有两个值可取, [0 , -1] ,
-1 参加位与运算的时候有个特点,a & -1 = a
//快速乘之递归
int quickMulti(int b, int a){
int ans=0;
(b != 0) && (ans = (a & -(b & 1)) + quickMulti(b >> 1, a << 1));
return ans;
}
int sumNums(int n){
return quickMulti(n, n+1) >> 1;
}
法三:计算内存
int sumNums(int n){
char a[n][n + 1];
return sizeof(a) >> 1;
//ans = 1 + 2 + 3 + ...+ n
// =(1 + n) * n / 2
// =sizeof(char a[n][n + 1]) / 2
// =sizeof(a) >> 1
}
时间复杂度:O(1)
空间复杂度:O(N ^ 2)
以上是关于剑指 Offer 64. 求1+2+…+n的主要内容,如果未能解决你的问题,请参考以下文章