题目1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
方法:双指针。如果和小于s,向后移;大于s,向前移。时间复杂度O(n)
bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2){
bool found = false;
if (length < 1 || num1 == NULL || num2 == NULL){
return found;
}
int ahead = length - 1;
int behind = 0;
while (ahead > behind){
long long curSum = data[ahead] + data[behind];
if (curSum == sum){
*num1 = data[behind];
*num2 = data[ahead];
found = true;
break;
}
else if (curSum > sum){
ahead--;
}
else {
behind++;
}
}
return found;
}
题目2:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。
方法:用small和big分别标识序列的最小值和最大值。
void FindContinuousSequence(int sum){
if (sum < 3){
return;
}
int small = 1;
int big = 2;
int middle = (1 + sum) / 2;
int curSum = small + big;
while (small < middle){
if (curSum == sum){
PrintContinuousSequence(small, big);
}
while (curSum > sum && small < middle){
curSum -= small;
small++;
if (curSum == sum){
PrintContinuousSequence(small, big);
}
}
big++;
curSum += big;
}
}
void PrintContinuousSequence(int small, int big){
for (int i = small; i <= big; ++i){
printf("%d ", i);
}
printf("\n");
}
测试用例:
- 功能测试(存在和为s的连续序列,如9、100等;不存在和为s的连续序列,如4、0)
- 边界值测试(连续序列的最小和3)