小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

基于visual Studio2013解决面试题之0303数组求和




题目



解决代码及点评

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

#include <iostream>
using namespace std;

// 查找函数,pnArr是有序数组
// nLen是数组长度
// nSum是期望的和
// a,b是查找结果下标,如果返回true,那么a,b有效
// 如果返回false说明没有办法求和,a,b无效
bool Find(int *pnArr, int nLen, int nSum, int &a, int &b)
{
    int i = 0;
    int j = nLen - 1;
	// 从两边逼近,i从数组小的一边,j从数组大的一边,逼近期望和
    while (i < j)
    {
        if (pnArr[i] + pnArr[j] > nSum)  // 如果和太大,则减小j,让下次和变小
        {
            j--;
        }
        else if (pnArr[i] + pnArr[j] < nSum) // 如果和太小,则增加i,让下次和变大
        {
            i++;
        }
        else   // 如果和正好等于期望和,那么说明已经找到了
        {
            a = i;
            b = j;
            return true;
        }
    }

    return false;
}

// 测试主函数
int main()
{
    int nArr[] = {1,3,5,7,9,12,32,45,56,78,90};
    int nLen = sizeof(nArr) / sizeof(int);
    int i, j;
    int nSum;
    cout<<"请输入一个数字:";
    cin>>nSum;
    if (Find(nArr, nLen, nSum, i, j))
    {
        cout<<nArr[i]<<" + "<<nArr[j]<<" = "<<nSum<<endl;
    }
    else
    {
        cout<<"没有两数之和为"<<nSum<<endl;
    }
    system("pause");
    return 0;
}



代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6704519

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果









posted on 2013-12-13 14:40  牛栏山1  阅读(182)  评论(0编辑  收藏  举报

导航