算法實戰(一)--猜數字

首先給大家推薦個網站叫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第一個例子,後面繼續更新。。。。。。

發佈了30 篇原創文章 · 獲贊 19 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章