这是今天去做紫光展锐的笔试时遇到的一个编程题,已知一个数组中的元素是升序排序的,其中有两个数的和为200(测试的时候改成了50),要求以最快的方式找出这两个数,当时就想到了借鉴快速排序算法中的思路,但是没写完整,有点遗憾,这是自己下来补充后的代码,测试后可以达到效果,但这种算法不一定是最快的,共勉。
/*dataArray为有序数组,其中只有两个数的和为sum,以最快的方法找出这两个数*/
int sum=50;
void FindNumber(int *dataArray, int size, int *number1, int *number2)
{
int low=0, high=size-1;
int temp=dataArray[low]+dataArray[high];
while (low<high && temp!=sum)
{
while (low<high && temp<sum)
{
low++;
temp=dataArray[low]+dataArray[high];
}
while (low<high && temp>sum)
{
high--;
temp=dataArray[low]+dataArray[high];
}
}
if(temp==sum)
{
*number1=dataArray[low];
*number2=dataArray[high];
}
else
{
*number1=0;
*number2=0;
}
}
void TestFindNumber()
{
int data[10]={1, 3, 6, 8, 10, 11, 12, 35, 40, 43};
int number1, number2;//用于存储找到的两个数
FindNumber(data, 10, &number1, &number2);
printf("number1: %d\t number2: %d\n", number1, number2);
}