菜菜的刷题日记 | 猜数字?我还真猜不到(力扣374)

请添加图片描述

系列索引菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子

菜菜的修仙之路——2022/1/18
今晚看了一会儿数据结构排序算法,发现之前对排序掌握的并不是很全面,像希尔这种都不会写,白天出门了,又是摆烂的一天。

【题目】

猜数字游戏的规则如下:

每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。

如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

返回我选出的数字。

  • 难度:简单

题目链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower/

【我的代码】

本来想摆,但一想到都坚持了这么多天了不能断火呀,既然写了题就顺道把题解奉上,今日事今日毕!
个人水平有限,大佬勿嘲 [/抱拳]
在这里插入图片描述
主要是双指针的思想。

class Solution:
    def guessNumber(self, n: int) -> int:
        i = 0
        j = n+1
        while i < j:
            point = int(i+(j-i)/2) #参考下面的最好写成 point = i + (j - i) // 2 
            if guess(point) == 0:
                return point
            elif guess(point) == -1:
                j = point
            elif guess(point) == 1:
                i = point

我觉得算法效率低也可能是我重复调用guess函数造成的。
在这里插入图片描述
后面我又试了一次,果然啊,看来一些小细节还是会影响很大效率的。

class Solution:
    def guessNumber(self, n: int) -> int:
        i = 0
        j = n+1
        while i < j:
            point = i+(j-i)//2
            temp = guess(point)
            if temp == 0:
                return point
            elif temp == -1:
                j = point
            elif temp == 1:
                i = point

【参考代码1】二分查找

其实这道题大家看看也就图一乐,考察的就是单纯地分析思维。某大佬只是和我用的指针初始位置不同,我是放在了1~n的两端,下面代码则是从其本身开始并结束的。

class Solution:
    def guessNumber(self, n: int) -> int:
        left = 1
        right = n
        while left <= right:
            mid = left + (right - left) // 2
            ans = guess(mid)
            if ans == 1:
                left = mid + 1
            elif ans == -1:
                right = mid - 1
            else:
                return mid
        return 0

【参考代码2】官方题解

二分时,记当前区间为 [left,right],初始时 left=1,right=n。记区间中间元素为 mid,若有 guess(mid)≤0 则说明 pick∈[left,mid],否则 pick∈[mid+1,right]。当区间左右端点相同时,则说明我们找到了答案,退出循环。

class Solution:
    def guessNumber(self, n: int) -> int:
        left, right = 1, n
        while left < right:
            mid = (left + right) // 2
            if guess(mid) <= 0:
                right = mid   # 答案在区间 [left, mid] 中
            else:
                left = mid + 1   # 答案在区间 [mid+1, right] 中
        
        # 此时有 left == right,区间缩为一个点,即为答案
        return left
        

【思考】

print('Good Night')

Python力扣题解系列持续更新,欢迎点赞收藏关注

上一篇:菜菜的刷题日记 | 215. 数组中的第K个最大元素
下一篇:菜菜的刷题日记 | 9. 回文数

本人水平有限,文章中不足之处欢迎下方👇评论区批评指正~

如果感觉对你有帮助,点个赞👍 支持一下吧 ~

不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 🤝 我的博客 ,期待在这与你相遇 ~

《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 9. 阅读下列程序片段,写出运行结果。 public class Test { public static void main(String[] args) { int percent = 10; tripleValue(percent); System.out.println(percent); } public static void tripleValue(int x) { x = 3 * x; } } 代码执行后输出的结果是______。 答案:10 [解析] static 关键字应用的场合有:①用来修饰类中定义的变量,这样的变量称为类变量或静态变量。②可以用来修饰类中定义的方法,这样的方法称为静态方法。③用来修饰初始化语句块,这样的语句块常称为静态初始化语句块。static 在这里表示这个方法为类方法,不属于任何对象实例,而是类所有,描述对象的共有动作,可以用类名直接调用。在调用了tripleValue函数之后,函数的值没有返回,所以percent的值还是10。 10. 阅读下列程序片段,写出运行结果。 class Shape { public Shape() { System.out.print("Shape"); } } class Circle extends Shape { public Circle() { System.out.print("Circle"); } } public class Test { public static void main(String[] args) { Shape d = new Circle(); } } 代码执行后输出的结果是______。 答案:ShapeCircle [解析] 继承是而向对象编程的一个主要优点之一,它对如何设计Java类有着直接的影响。继承有如下几点好处: ①它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其他类有什么不同即可,而且还可以动态访问其他有 关类中的信息。 ②通过继承,可以利用Java类库所提供的丰富而有用的类,这些类都已经被很好地实现。 ③当设计很大的程序时,继承可以使程序组织得层次清晰,有利于程序设计相减少错误的发生。该程序首先编写了一个Shape的类,然后又编写一个类Circle去继承Shape类。由于子类拥有父类所有的属性和方法,所以输出的是ShappeCircle。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值