剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n - 力扣(Leetcode)
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
再加一个条件不可使用位运算符;
这里我们会发现,几乎将所有的路都给堵死了,在这里我个人有两种方法解决,该问题分别是利用C++的类静态成员变量与逻辑运算符解决
C++的类静态成员解决问题
利用类创建时会调用构造函数的特性利用指针与new关键字创建N个类,类中的2个静态变量分别,自增与累加。然后调用成员函数将累加的值返回到func函数,这里有个小细节,为了防止外界主函数多次调用,我们自定义类需要在返回值保存后重置2个静态变量。
class A
{
public:A(){_count++;_sum += _count;}static int print(){return _sum;}void Destroy(){_count=0;_sum=0;}
private:int _a;static int _count;static int _sum;
};
int A::_count = 0;
int A::_sum = 0;int func(int n)
{A* p = new A[n]();int ret = p->print();p->Destroy();return ret;
}
class Solution {
public:int sumNums(int n) {int ret=func(n);return ret;}
private:
};
利用逻辑运算符||或&&
这个解法就比较抽象了,关键要理解单独拿出来的逻辑运算符短路原理
||短路,当左为真,右不在运算判断
int a=0;
1||++a;//左得到结果,发生短路,不会执行右表达式。
cout<<a<<endl;//打印0;
&&短路,当左为假,右不在运算判断
int a=0;
0&&++a;//左得到结果,发生短路,不会执行右表达式。
cout<<a<<endl;//打印0;
这里利用特性将函数递归加,保证一行代码两个表达式,并且利用短路做递归结束判断
&&短路
int sumNums(int n){n!=0&&(n+=sumNums(n-1));return n;
}
如果n不为0则左为真,就进入逻辑运算符右边函数中,当递归到n==0时左为假,发生短路,不再进入右表达式,return n(0) 的值。和上一层的n+=,从下往上0+1+2+3...+n 最后返回到主函数。
||短路
int sumNums(int n){n==0||(n+=sumNums(n-1));return n;
}
如果n不为0则左为假,就进入逻辑运算符右边函数中,当递归到n==0时左为真,发生短路,不再进入右表达式,return n(0) 的值。和上一层的n+=,从下往上0+1+2+3...+n 最后返回到主函数。