No1 序号:374 (二分)
地址:https://leetcode-cn.com/problems/guess-number-higher-or-lower/
开发语言:python或C++
1、题目内容
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
首先本题的难点是审题方面。 guess(mid)中的mid相当于 num,就是猜的数字。最终返回的是真实的pick数字。
1、具体实现
1.C++实现
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
class Solution {
public:
int guessNumber(int n) {
int l,r,mid,res;
l=1;r=n;
while(l <= r){
mid = l+(r-l)/2;
res = guess(mid);
if(res==0) return mid;
if(res==-1) r = mid-1;
if(res==1) l = mid+1;
}
return -1;
}
};
- Python实现
# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num):
class Solution(object):
def guessNumber(self, n):
"""
:type n: int
:rtype: int
"""
l = 1
r = n
while l<r:
mid = l + (r-l)/2
res = guess(mid)
if res == 0:
return mid
elif res == -1:
r = mid-1
elif res ==1:
l = mid+1
return l
- Python3实现
# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num: int) -> int:
class Solution:
def guessNumber(self, n: int) -> int:
l = 1
r = n
while l<r:
mid =int(l + (r-l)/2)
res = guess(mid)
if res == 0:
return mid
elif res == -1:
r = mid-1
elif res ==1:
l = mid+1
return int(l)
- Java实现
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
public class Solution extends GuessGame {
public int guessNumber(int n) {
int l,r,mid,res;
l=1;r=n;
while(l < r){
mid = l+(r-l)/2;
res = guess(mid);
if(res==0) return mid;
if(res==-1) r = mid-1;
if(res==1) l = mid+1;
}
return l;
}
}
3、注意事项
- 由于n值范围比较大,如果计算mid用(l+r)/2会超出int类型的范围。方法1-可以存为long int类型(没有尝试)
方法二- mid = l +(r-l)/2 - while(l<n) ----最后 return l;
while(l<=n) -----最后 return -1;或return l;都行 - 为节省运行时间,guess(mid)要单独计算出来用一个变量存储。不用每次判断时都计算一遍。
- 对于python的类还有python3的类还可以如何优化会持续更新,这块掌握不太好。欢迎大家留言。