面试100题:14.求在有序数组中查找两个数的和为指定数

题目

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组12471115和数字15。由于4+11=15,因此输出411

分析

此题目要求是时间复杂度为O(n),意味着只能遍历一次数组。另外要充分利用该数组已经排序的特征。可以从2端同时遍历,对a[begin]+a[end]进行3种情况的考虑:1)大于给定和,则把end--2)小于给定和,则把begin++3)相等,则打印结果。

  1. /*Title:14.求在数组中查找两个数的和为指定数 
  2. Author:gocode 
  3. Date:2012-10-12*/  
  4.    
  5. #include <iostream>  
  6. using namespace std;  
  7.    
  8. bool ValidateSum(int a[], int length, int sum)  
  9. {  
  10.     int i = 0;  
  11.     int j = length - 1;  
  12.     bool flag = false;  
  13.       
  14.     /*while(i<=(length - 1) && 0<=j)*/  
  15.     while(i < j)  
  16.     {  
  17.         int result = a[i]+a[j];  
  18.         if(result > sum)  
  19.             --j;  
  20.         else if(result < sum)  
  21.             ++i;  
  22.         else if(result == sum)  
  23.         {  
  24.             flag = true;  
  25.             break;  
  26.         }  
  27.     }  
  28.       
  29.     if(flag)  
  30.         cout<<"找到两个数是: "<<a[i]<<" 和 "<<a[j]<<endl;  
  31.     else  
  32.         cout<<"没有找到"<<endl;  
  33.     return flag;  
  34. }  
  35.    
  36. void main()  
  37. {  
  38.     int a[] = {1, 2, 4, 7, 11, 15};  
  39.     int len = sizeof(a)/sizeof(a[0]);  
  40.     ValidateSum(a, len, 15);  
  41.     getchar();  
  42. }  

补充strstr函数

  1. /*Title:<span style="font-family:Microsoft YaHei;">   </span>实现strstr函数 
  2. Author:<span style="font-family:Microsoft YaHei;">     </span>gocode 
  3. Date:<span style="font-family:Microsoft YaHei;">        </span>2012-10-12*/  
  4.    
  5. #include <iostream>  
  6. using namespace std;  
  7.    
  8. char * __cdecl StrstrFunc (  
  9.     char *str1,  
  10.     char *str2  
  11.     )  
  12. {  
  13.     char *cp = (char *) str1;  
  14.     char *s1, *s2;  
  15.    
  16.     if ( !*str2 )  
  17.         return((char *)str1);  
  18.    
  19.     while (*cp)  
  20.     {  
  21.         s1 = cp;  
  22.         s2 = (char *) str2;  
  23.    
  24.         while ( *s1 && *s2 && !(*s1-*s2) )  
  25.             s1++, s2++;  
  26.    
  27.         if (!*s2)  
  28.         {  
  29.             cout<<cp<<endl;  
  30.             return(cp);  
  31.         }  
  32.    
  33.         cp++;  
  34.     }  
  35.    
  36.     return NULL;  
  37. }  
  38.    
  39. void main()  
  40. {  
  41.     char *a1 = "ABCDAA";  
  42.     char *a2 = "CDAA";  
  43.    
  44.     StrstrFunc(a1, a2);  
  45.     getchar();  
  46. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值