LeetCode —— 299. 猜数字游戏

这篇具有很好参考价值的文章主要介绍了LeetCode —— 299. 猜数字游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LeetCode —— 299. 猜数字游戏

一、题目描述:

你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:

写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:

猜测数字中有多少位属于数字和确切位置都猜对了(称为 “Bulls”,公牛),
有多少位属于数字猜对了但是位置不对(称为 “Cows”,奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。

提示的格式为 “xAyB” ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。

请注意秘密数字和朋友猜测的数字都可能含有重复数字。

示例 1:

输入:secret = “1807”, guess = “7810”

输出:“1A3B”

解释:数字和位置都对(公牛)用 ‘|’ 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。

“1807”
|
“7810”

示例 2:

输入:secret = “1123”, guess = “0111”

输出:“1A1B”

解释:数字和位置都对(公牛)用 ‘|’ 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。

“1123” “1123”
| or |
“0111” “0111”

注意,两个不匹配的 1 中,只有一个会算作奶牛(数字猜对位置不对)。通过重新排列非公牛数字,其中仅有一个 1 可以成为公牛数字。

提示:

1 <= secret.length, guess.length <= 1000

secret.length == guess.length

secret 和 guess 仅由数字组成

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/bulls-and-cows

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的思路很简单,分别计算A和B的数目。

    计算A的数目通过比较guess和secret两个字符串中位置和字符相等的个数得到。

    如果字符串的某个数字及其位置相等,我们就将A加一。否则我们就把两个字符串这个位置的两个字符放入两个切片中,这两个切片是s和g。

    然后再遍历两个切片,将两个切片中所有数字的数目较小值加到B之上。

    最后使用fmt.Sprintf将A、B格式化到字符串中。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,出现了下面这个问题:

        for i,v := range guess{
            if v == secret[i]{
                A++
            }else {
                s[secret[i]-'0']++
                g[v-'0']++
            }
        }
    
    Line 5: Char 14: invalid operation: v == secret[i] (mismatched types rune and byte) (solution.go)
    

    就是guess[i]和v的类型不一致,一个是byte,一个是rune。

    for…range遍历字符串每个元素的类型是rune(int32),即utf-8字符对应的unicode码点。用下标来访问的话,每个元素的类型是个byte(uint8)。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    func getHint(secret string, guess string) string {
        numA := 0
        numB := 0
        
        arr := [10]int{}
    
        for i:=0;i<len(secret);i++{
            if secret[i]==guess[i] {
                numA++
            } else {
                // 如果secret[i]-'0' 小于0,说明guess中出现了
                // 如果不小于,有两种情况 1、secret中出现的比guess中多 2、guess中没有出现过
    
                // 只要有另一方出现了这个数字,且次数比自己多,那么就有奶牛一只(说白了就是比较两方这个数字出现的次数)
                if (arr[secret[i]-'0'] < 0) {
                    arr[secret[i]-'0']++
                    numB++
                } else {
                    arr[secret[i]-'0']++
                }
                // 同理
                if (arr[guess[i]-'0'] > 0) {
                    arr[guess[i]-'0']--
                    numB++
                } else {
                    arr[guess[i]-'0']--
                }
                
            }
        }
    
        return strconv.Itoa(numA)+"A"+strconv.Itoa(numB)+"B"
    }
    
    作者:dong-180
    链接:https://leetcode.cn/problems/bulls-and-cows/solution/yi-ge-shu-zu-yi-ci-xun-huan-shuang-bai-j-khue/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:文章来源地址https://www.toymoban.com/news/detail-492238.html

func getHint(secret string, guess string) string {
    A,B := 0,0
    s,g := make([]int,10), make([]int,10)
    for i := range guess{
        if guess[i] == secret[i]{
            A++
        }else {
            s[secret[i]-'0']++
            g[guess[i]-'0']++
        }
    }

    for i := range s{
        B += min(g[i],s[i])
    }
    res := fmt.Sprintf("%dA%dB",A,B)
    return res
}

func min(a,b int) int {
    if a>b{
        return b
    }else{
        return a
    }
}

到了这里,关于LeetCode —— 299. 猜数字游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 某软件的一个模块的需求规格说明书中描述【软件测试题目】

    某软件的一个模块的需求规格说明书中描述 (1)年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2% (2)非年薪制员工:严重过失,扣除当月薪资的8%;过失,扣除当月薪资的4% (1)分析原因及结果 原因 c1:年薪制员工 c2:非年薪制员工 c3:过失 c4:严重过失

    2024年02月08日
    浏览(49)
  • 数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

    目录 题目描述 输入示例 输出示例 解题思路  解题方法(C语言) 解析 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如: 假设遍历一个节点数为6的二叉树(节点数据分别为1到6)时, 堆栈操作为:push(1);push(2);push(3);pop();pop();push(4);pop()

    2024年02月07日
    浏览(50)
  • (数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述

    A:概述 边界链码 :是一种用于图像处理和计算机视觉领域的技术,主要用于 描述二进制图像中物体的轮 廓。边界链码通过将轮廓转化为一系列有序的连续像素点来表示。边界链码的基本思想是 从图像中选择一个起始点,然后按照一定的顺序遍历相邻像素,将它们连接起来

    2024年02月10日
    浏览(66)
  • 【LeetCode题目详解】(一些双指针的题目)27. 移除元素

    给你一个数组 nums   和一个值 val ,你需要 原地 移除所有数值等于  val   的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组 。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什

    2024年01月22日
    浏览(42)
  • leetcode 哈希表相关题目

    题目:https://leetcode.cn/problems/valid-anagram/description/ 题解:https://leetcode.cn/problems/valid-anagram/solutions/2602947/shu-zu-ha-xi-biao-tong-ji-mei-ge-zi-mu-c-vhh5/ 题目:https://leetcode.cn/problems/intersection-of-two-arrays/description/ 题解:https://leetcode.cn/problems/intersection-of-two-arrays/solutions/2603171/jie-guo-shu-zu-un

    2024年01月21日
    浏览(39)
  • 【LeetCode】丑数题目合辑

    思路 首先,丑数必须是 正整数 ,因此对于 n1 都可以直接返回 false; 对于 n = 1 ,如果 n 能够被 2/3/5 整除,说明它们是丑数。 代码 思路 要得到第 n 个丑数,可以使用 最小堆 实现。 初始化堆为空,首先将最小的丑数 1 加入。每次取出堆顶元素 x ,则 x 是堆中最小的丑数,

    2024年02月13日
    浏览(47)
  • 【LeetCode】动态规划类题目详解

    所有题目均来自于LeetCode,刷题代码使用的Python3版本 如果某一个问题有重叠的子问题,则使用动态规划进行求解是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点区别于贪心算法 动态规划五部曲 确定dp数组以及下标的含义 确定递推公式 dp数组如何

    2024年04月11日
    浏览(48)
  • 题目:2520.统计能整除数字的位数

    ​​ 题目来源:         leetcode题目,网址:2520. 统计能整除数字的位数 - 力扣(LeetCode) 解题思路:        逐位判断即可。 解题代码: 总结:         无官方题解。

    2024年02月13日
    浏览(64)
  • 关于链表的题目—leetcode

    问题描述: 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 - 1 - 9. 示例 2: 输入

    2023年04月25日
    浏览(35)
  • 【pygame游戏开发】这几个经典游戏,小红书Python面试题目

    pygame.time.set_timer(change_hole_event, 800) mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos) hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250)) clock = pygame.time.Clock() your_score = 0 flag = False init_time = pygame.time.get_ticks() while True: time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.) if time_remain == 40 and not flag: hole

    2024年04月25日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包