剑指 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<

&&短路,当左为假,右不在运算判断

int a=0;
0&&++a;//左得到结果,发生短路,不会执行右表达式。
cout<

这里利用特性将函数递归加,保证一行代码两个表达式,并且利用短路做递归结束判断

&&短路

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 最后返回到主函数。

你可能感兴趣的:(leetcode,算法)