1. 题目来源
链接:求1+2+…+n
来源:LeetCode——《剑指-Offer》专项
2. 题目说明
求 1+2+...+n
,要求不能使用乘除法、for
、while
、if
、else
、switch
、case
等关键字及条件判断语句(A?B:C
)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
3. 题目解析
方法一:思维+数学+巧妙解法
等差数列求和公式。
参见代码如下:
// 执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :7.4 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
int sumNums(int n) {
return (int)(pow(n, 2) + n) >> 1;
}
};
方法二:思维+构造函数+巧妙解法
常见的解法,创建 n
个实例,则构造函数会被调用 n
次,将累加代码放入类内即可,采用 static
标识全局唯一共享,构造函数
参见代码如下:
// 执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :7.7 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
class Sum{
public:
Sum() {
sum += i;
++i;
}
};
int sumNums(int n) {
sum = 0;
i = 1;
Sum arr[n];
return sum;
}
private:
static int sum;
static int i;
};
int Solution::sum = 0;
int Solution::i = 1;
方法三:思维+运算符短路+顶级解法
&& 的短路特性
A && B
A 为 true
,则返回表达式B
的bool
值A 为 false
,则返回false
利用该特性使用 && 的短路原则作为递归的结束条件。
来自评论区大佬的分析,借鉴学习:
参见代码如下:
// 执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :7.9 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n - 1));
return n;
}
};