[剑指-Offer] 64. 求1+2+…+n(思维、顶级解法)

1. 题目来源

链接:求1+2+…+n
来源:LeetCode——《剑指-Offer》专项

2. 题目说明

1+2+...+n ,要求不能使用乘除法、forwhileifelseswitchcase 等关键字及条件判断语句(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,则返回表达式 Bbool
  • 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;
    }
};
发布了343 篇原创文章 · 获赞 197 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/yl_puyu/article/details/104788569