芒果爱吃胡萝卜 - c语言
type: channel
link: http://blog.mangolovecarrot.net/tag/c%E8%AF%AD%E8%A8%80/
items: LeetCode - C语言，猜数字

LeetCode - C语言，猜数字
type: item
date: 2020-07-03T23:22:18+08:00
description: 题目猜数字大小我们正在玩一个猜数字游戏。 游戏规则如下：我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。每次你猜错了，我会告诉你这个数字是大了还是小了。你调用一个预先定义好的接口 guess(int num)，它会返回 3 个可能的结果（-1，1 或 0）：-1 : 我的数字比较小 1 : 我的数字比较大 0 : 恭喜！你猜对了！示例 :输入: n = 10, pick = 6输出: 6我提交的解答在所有131个解答中最高效。解题思路喜闻乐见的猜数字。用2个变量标记当前要猜的范围即可。每次在这个范围内取中间的数。注意点取中间数的时候，由于是整形，会出现奇数不能整除2导致丢失一个数。做一下特殊判断即可。如果当前应该往小了猜，并且最小值就比上一轮猜的数小1则不用再取范围直接返回最小值即可。反之亦然。还有要注意的是接受guess函数返回值的变量不能是无符号的，我这里用了char。代码/** * 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); */ int guessNumber(int n){ unsigned int pick = n/2; char ret = 0; unsigned int min = 0; unsigned int max = n; ret=guess(pick); while(ret !=0 ){ if(ret==-1){ if(pick - min == 1) return min; max = pick; pick-=(pick-min)/2; }else{ if(max - pick == 1) return max; min = pick; pick+=(max-pick)/2; } ret=guess(pick); } return pick; }虽然是个小品程序，要考虑的点却不少。