算法实战(一)--猜数字

首先给大家推荐个网站叫LeetCode Online,这是一个刷算法的网站;
今天lz做了一道题,这是原题的链接,猜数字;
题目很简单哈,举个例子
人家先选定个数字,比如说6,然后让你从1-10猜出来;
首先它给你一个函数,int guess(n);
你调用这个函数,如果n比6大它就返回1,如果n比6小就返回-1,如果n等于六就返回0;

这题我看见后第一个想到的就是二分法:

int binary(int low, int high)
{
    int avg = (low + high)/2;
    switch (guess(avg))
    {
    case 1:
        return binary(avg, high);
        //break;
    case -1:
        return binary(low, avg);
        //break;
    case 0:
        return avg;
        //break;
    default:
        return 0;
    }

    return 0;
}

后来本着严谨的原则,做了一下改进:

int binary(int low, int high)
{
    int sum = high - low;
    int avg;

    if (low <= 0 || high <= 0)
    {
        return 0;
    }

    if (sum < 0)
    {
        return 0;
    }
    else if (sum == 0)
    {
        return low;
    }
    else if (sum ==1 )
    {
        if (guess(low) == 0)
        {
            return low;
        }
        else
        {
            return high;
        }
    }

    avg = (high + low)/2;
    switch (guess(avg))
    {
    case 1:
        return binary(avg, high);
        //break;
    case -1:
        return binary(low, avg);
        //break;
    case 0:
        return avg;
        //break;
    default:
        return 0;
    }

    return 0;
}

自己测了一下,没毛病!美滋滋的就提交了,结果人家一测就给你测出毛病了!

当时的测试用例是:
给定的数字是1702766719,给定的范围是2126753390;
我看了一调试,坏菜了:

avg = (low + high)/2;

这步low+high超出了int正数表示范围,一下子变成负数了。我想了一想,做出了如下改进:

avg = (low - high)/2 + low;

最后终于通过了;

当然这肯定不是最优算法,只是这个问题告诉我们,细节很重要,同样单元测试也很重要,我自己就没测出来;

这是lz第一个例子,后面继续更新。。。。。。

你可能感兴趣的:(算法实战)