【Lintcode】1299. Bulls and Cows

题目地址:

https://www.lintcode.com/problem/bulls-and-cows/description

一个猜数字游戏,给定两个字符串 s s s g g g s s s是要猜的字符串, g g g是猜测的字符串,如果 g g g猜中了数字和位置,则记 x x x个,如果猜中了数字但位置不对,则记 y y y个,返回 x A y B xAyB xAyB这样的字符串。

用一个哈希表记录 s s s中每个字符串出现了多少次,然后遍历 g g g,如果发现位置相同的字符也相同,则记 A A A的数加 1 1 1,并把这个字符从哈希表里次数减去 1 1 1;如果发现不同,但哈希表里有,则记 B B B的数加 1 1 1,并也把这个字符从哈希表里次数减去 1 1 1。代码如下:

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public String getHint(String secret, String guess) {
        // write your code here
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < secret.length(); i++) {
            map.put(secret.charAt(i), map.getOrDefault(secret.charAt(i), 0) + 1);
        }
    
        int A = 0, B = 0;
        for (int i = 0; i < guess.length(); i++) {
            char g = guess.charAt(i);
            if (g == secret.charAt(i)) {
                A++;
                map.put(g, map.get(g) - 1);
            } else {
                if (map.containsKey(g)) {
                    B++;
                    map.put(g, map.get(g) - 1);
                    // 如果g被删光了,则从哈希表里也删除
                    if (map.get(g) == 0) {
                        map.remove(g);
                    }
                }
            }
        }
        
        return A + "A" + B + "B";
    }
}

时空复杂度 O ( l s ) O(l_s) O(ls)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值