题目要求:
We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number is higher or lower.
You call a pre-defined API guess(int num)
which returns 3 possible results (-1
, 1
, or 0
):
-1 : My number is lower
1 : My number is higher
0 : Congrats! You got it!
Example:
n = 10, I pick 6.
Return 6.
这道题目是一道比较典型的二分查找题目,实现起来非常简单,具体实现方式如下:
// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);
class Solution {
public:
int guessNumber(int n)
{
int lowNum=1;
int highNum=n;
int number=lowNum/2+highNum/2;
while(guess(number)!=0)
{
if(guess(number)==1)
{
lowNum=number;
}
else
{
highNum=number;
}
if(number==(lowNum/2+highNum/2))
{
number=number+1;
}
else
{
number=lowNum/2+highNum/2;
}
}
return number;
}
};
public:
int guessNumber(int n)
{
int lowNum=1;
int highNum=n;
int number=lowNum/2+highNum/2;
while(guess(number)!=0)
{
if(guess(number)==1)
{
lowNum=number;
}
else
{
highNum=number;
}
if(number==(lowNum/2+highNum/2))
{
number=number+1;
}
else
{
number=lowNum/2+highNum/2;
}
}
return number;
}
};
但比较值得注意的地方有两点
1、由于是对int整形数进行计算,在二分的时候得到的结果也是int类型的,因此在对相邻两个数字进行判断时需要特殊处理,以免进入无限循环;
2、越界情况:虽然输入输出都是int类型,但在其中进行二分计算的时候如果直接用相加的和除以二的方式,有可能会在加的结果部分出现越界,因此进行了调整,先除再加,这样就避免的越界情况的发生。