使用kimi刷leecode之猜数字

使用kimi刷leecode之猜数字

首页休闲益智Make8更新时间:2024-10-23

都说AI编程能力已经可以达到取代程序员的步骤,那我们就来试试程序员都刷的leecode算法题吧,今天试试猜数字,经过反复六轮沟通,kimi给出的答案始终无法通过测试用例,最后人工修复下,才算正确。

提问:

你在和朋友一起玩 猜数字(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 仅由数字组成 请用分别使用JAVA,golang实现上述算法题,要求附带中文注释,说明实现思路

kimi回答Java实现

public class BullsAndCows { public static String getHint(String secret, String guess) { int bulls = 0; int cows = 0; int[] secretNums = new int[10]; int[] guessNums = new int[10]; // 计算公牛和记录数字出现次数 for (int i = 0; i < secret.length(); i ) { if (secret.charAt(i) == guess.charAt(i)) { bulls ; } else { secretNums[secret.charAt(i) - '0'] ; guessNums[guess.charAt(i) - '0'] ; } } // 计算奶牛,通过比较两个数组的数字出现次数减去已经匹配的公牛数量 for (int i = 0; i < 10; i ) { cows = Math.min(secretNums[i], guessNums[i]); } // 减去多算的公牛数量,因为一个数字不能同时是公牛和奶牛 cows -= bulls; return bulls "A" cows "B"; } public static void main(String[] args) { String secret = "1807"; String guess = "7810"; System.out.println(getHint(secret, guess)); // 输出:"1A3B" secret = "1123"; guess = "0111"; System.out.println(getHint(secret, guess)); // 输出:"1A1B" } }实现思路

  1. 遍历secret和guess,对于每个索引相同的字符,如果相同则计数bulls(公牛)。
  2. 如果不同,则在两个数组secretNums和guessNums中增加对应数字的出现次数。
  3. 遍历这两个数组,对于每个数字,取两个数组中该数字出现次数的较小值,累加到cows(奶牛)。
  4. 由于可能存在一个数字既是公牛又是奶牛,因此需要从cows中减去bulls的数量,以修正多算的奶牛数量。
  5. 返回格式化后的字符串xAyB。
Go实现

package main import ( "fmt" ) func getHint(secret string, guess string) string { bulls, cows := 0, 0 secretNums, guessNums := make([]int, 10), make([]int, 10) // 计算公牛和记录数字出现次数 for i := range secret { if secret[i] == guess[i] { bulls } else { secretNums[int(secret[i]-'0')] guessNums[int(guess[i]-'0')] } } // 计算奶牛 for i := 0; i < 10; i { cows = min(secretNums[i], guessNums[i]) } // 减去多算的公牛数量 cows -= bulls return fmt.Sprintf("??", bulls, cows) } func min(a, b int) int { if a < b { return a } return b } func main() { secret := "1807" guess := "7810" fmt.Println(getHint(secret, guess)) // 输出:"1A3B" secret = "1123" guess = "0111" fmt.Println(getHint(secret, guess)) // 输出:"1A1B" }实现思路

Go语言的实现思路与Java实现相同,主要区别在于Go语言的语法和内置函数的使用。Go语言中使用range来遍历字符串,并且使用int(secret[i]-'0')来将字符转换为数字。此外,Go语言中使用fmt.Sprintf来格式化输出字符串。

在两种语言的实现中,核心逻辑是一致的:统计公牛、统计每个数字的出现次数,然后计算奶牛数量,最后返回格式化后的提示字符串。

提交到leecode测试,第一组测试结果就没有过,kimi给的代码输出是1A2B,不是预期的1A3B。

给KIMI详细解释:

还是错的。 输入:secret = "1807", guess = "7810" 输出:"1A3B" 输入:secret = "1123", guess = "0111" 输出:"1A1B" 输入:secret = "1122", guess = "2211" 输出:"0A4B" 关键点,数字和位置都对,才是公牛,比如1807、7810中,8在两个数字中都是第二位,才是公牛,剩下的1、0、7三个数字在两个数字中都有,但是位置对不上是奶牛,所以结果是1A3B;对于1123、0111来说,第二位的1是相同的所以是1公牛,0111中的0没有在1123中出现,所以什么也不是,第三位1在1123中的第一位出现,算1奶牛,第四位1,在1122中没有额外的1了,所以他也是什么都不算,所以输出1A1B;对于1122、2211可以同理,没有一位数字的位置是对的,所以没有公牛,但是2211对应在1122里面都有对应的数字,只是位置不对,所以输出是0A4B

就这样反复沟通了6轮,都没给出正确的代码,最后只能自己上手给他KIMI正确的代码。

附能通过leecode测试用例的代码实现:

JAVA:

import java.util.HashMap; import java.util.Map; public class BullsAndCows { public static String getHint(String secret, String guess) { int bulls = 0; int cows = 0; Map<Character, Integer> secretCount = new HashMap<>(); Map<Character, Integer> guessCount = new HashMap<>(); // 计算公牛和每个数字出现的次数 for (int i = 0; i < secret.length(); i ) { char secretChar = secret.charAt(i); char guessChar = guess.charAt(i); if (secretChar == guessChar) { bulls ; } else { secretCount.put(secretChar, secretCount.getOrDefault(secretChar, 0) 1); guessCount.put(guessChar, guessCount.getOrDefault(guessChar, 0) 1); } } // 计算奶牛 for (Map.Entry<Character, Integer> entry : guessCount.entrySet()) { Character key = entry.getKey(); Integer guessValue = entry.getValue(); if (secretCount.containsKey(key)) { cows = Math.min(guessValue, secretCount.get(key)); } } return bulls "A" cows "B"; } public static void main(String[] args) { String secret = "1807"; String guess = "7810"; System.out.println(getHint(secret, guess)); // 预期输出:"1A3B" secret = "1123"; guess = "0111"; System.out.println(getHint(secret, guess)); // 预期输出:"1A1B" secret = "1122"; guess = "2211"; System.out.println(getHint(secret, guess)); // 预期输出:"0A4B" } }

Golang实现:

func getHint(secret, guess string) string { bulls, cows := 0, 0 var secretCount = make(map[uint8]int, 0) var guessCount = make(map[uint8]int, 0) // 计算公牛和每个数字出现的次数 for i := range secret { if secret[i] == guess[i] { bulls } else { secretCount[secret[i]] guessCount[guess[i]] } } // 计算奶牛 for k, v := range guessCount { if n, ok := secretCount[k]; ok { cows = min(v, n) } } return fmt.Sprintf("??", bulls, cows) }

AI给出来的实现思路总结:

实现思路
  1. 使用两个HashMap来分别存储secret和guess中每个字符及其出现次数。
  2. 遍历secret和guess,对于相同位置上相同的字符,增加公牛计数。
  3. 对于不同位置上的字符,更新两个HashMap中的计数。
  4. 遍历guessCount,对于每个键值对,检查secretCount中是否存在对应的键,如果存在,计算两个计数中的较小值,并将其加到奶牛计数中。
  5. 最后,返回格式化后的字符串xAyB,其中x是公牛的数量,y是奶牛的数量。
查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved