题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
解题思路:双指针法
维护两个指针left和right,left为1,right为2. 两个指针中是一个序列
具体的方法是,如果指针中序列的值小于和Sum,就让right指针自增1,让序列的值更大
如果序列的和大于Sum,就让left指针自增1,减少序列的和值
如果等于,就把left和right指针维护的序列保存起来
具体代码如下:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> res;
int leftNum = 1, rightNum = 2;
while(leftNum < rightNum) {
int curSum = (leftNum + rightNum) * (rightNum - leftNum + 1) / 2;
if(curSum < sum) {
rightNum++;
}
else if(curSum == sum) {
vector<int> v;
for(int j = leftNum; j <= rightNum; ++j) {
v.push_back(j);
}
res.push_back(v);
leftNum++;
}
else {
leftNum++;
}
}
return res;
}
题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
这道题在牛客网看了许多的解法,只能感慨自己的脑袋是个浆糊
解法一:
int Sum_Solution(int n) {
int ret = n;
ret && (ret += Sum_Solution(n - 1));
return ret;
}
解法二:
int Sum_Solution(int n) {
bool a[n][n+1];
return sizeof(a)>>1;
}
解法二的思路是:等差数列求和公式: n(n + 1) / 2
解法三:
def Sum_Solution(self, n):
# write code here
return sum(list(range(1, n + 1)))
说实话,人生苦短....
解法四:
class assit {
public:
assit() {
N++;
sum += N;
}
static void reset() {N = 0; sum = 0;}
static int GetSum() {return sum;}
private:
static int N;
static int sum;
};
int assit::N = 0;
int assit::sum = 0;
class Solution {
public:
int Sum_Solution(int n) {
assit::reset();
assit* ptr = new assit[n];
delete[] ptr;
ptr = NULL;
return assit::GetSum();
}
};
这道题用的方法是类的构造函数,通过在类中设置两个静态变量,然后再创建n个对象,在类的构造函数中对两个静态变量进行操作