都说AI编程能力已经可以达到取代程序员的步骤,那我们就来试试程序员都刷的leecode算法题吧,今天试试猜数字,经过反复六轮沟通,kimi给出的答案始终无法通过测试用例,最后人工修复下,才算正确。
提问:kimi回答Java实现你在和朋友一起玩 猜数字(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实现上述算法题,要求附带中文注释,说明实现思路
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"
}
}
实现思路
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给出来的实现思路总结:
实现思路Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved