《算法题》求1+2+3+...+n(牛客中等题)
文章目录
- 一、题目链接
- 二、思路
- 三、代码全视图
一、题目链接
题目链接(牛客网)
二、思路
不使用任何循环语句(for/while等)不使用条件判断语句(if/else/switch/三元运算符等)不使用乘除法
为了规避这些限制,我们可以利用
静态成员变量在所有对象间共享
进行编写代码。
首先我们定义并初始化一个类,期间使用static int _i作为计数器,static int _ret 作为储存累加量的整形(同时充当返回值)。这样由于static在静态存储区上,而非普通变量对象所在内存(栈/堆)上。故此它们不会随对象创建销毁。
内存布局:
以n=3为例:
初始化静态成员: _i = 0 _ret = 0创建sum maysheeo[3]数组: 构造第1个对象: _i = 0 + 1 = 1 _ret = 0 + 1 = 1 构造第2个对象: _i = 1 + 1 = 2 _ret = 1 + 2 = 3 构造第3个对象: _i = 2 + 1 = 3 _ret = 3 + 3 = 6返回sum::ret(),即返回6
其间核心思路在于:
-
1.利用静态成员保持状态:
_i:静态成员变量,记录当前要累加的数字(初始化为0)
_ret:静态成员变量,记录累加的总和(初始化为0)
-
2.通过对象构造实现隐式循环:
创建n个sum类对象
每个对象构造时自动执行构造函数中的累加操作
n次构造 ⇒ n次累加 ⇒ 实现1到n的求和
三、代码全视图
class sum {public: sum() { _i = _i + 1; // 先递增_i,让i变成1. _ret = _ret + _i; // 然后将递增后的_i加到_ret } static int ret() { return _ret; } private: static int _i; // 当前数字 static int _ret; // 累加结果};// 静态成员初始化int sum::_ret = 0;int sum::_i = 0;class Solution {public: int Sum_Solution(int n) { sum maysheeo[n]; // 创建n个sum对象的数组。 //创建sum对象数组时,会调用n次构造函数。 return sum::ret(); // 返回累加结果 }};