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