题目一:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
实现代码:
bool GetTwoNumWithDestSum(int* pData, int size, int destData, int& num1, int& num2)
{
if (nullptr == pData || size < 2) return false;
int back = 0; // back数据指向第一个
int front = size - 1; // front指向最后一个
while (back < front)
{
if (pData[back] + pData[front] == destData)
{
num1 = pData[back];
num2 = pData[front];
return true;
}
else if (pData[back] + pData[front] > destData) --front; // front前移
else ++back; // back后移
}
return false;
}
题目二:
输入一个正数s,打印出所有和为s的连续正整数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所有结果打印出3个连续序列1-5、4-6、7-8。
实现代码:
void PrintContinousSequence(int beginData, int endData)
{
for (int curData = beginData; curData <= endData; ++curData) std::cout << curData << " ";
std::cout << std::endl;
}
bool GetContinousSequence(int destData)
{
bool hasFound = false;
if (destData < 3) hasFound;
int beginData = 1;
int endData = 2;
int middleData = (destData + 1) / 2;
int curSum = beginData + endData;
while (beginData < middleData) // 注意这里的判断条件
{
if (curSum == destData)
{
PrintContinousSequence(beginData, endData);
curSum -= beginData;
++beginData;
hasFound = true;
}
else if (curSum > destData)
{
curSum -= beginData; // 当前和扣除尾部
++beginData; // 尾部向前移动
}
else
{
++endData; // 首部向前移动
curSum += endData; // 当前和加上新首部
}
}
return hasFound;
}