【Leetcode】Bulls and Cows

题目链接:https://leetcode.com/problems/bulls-and-cows/

题目:

You are playing the following Bulls and Cows game with your friend: You write down a number and
ask your friend to guess what the number is. Each time your friend makes a guess, you provide a hint that indicates how many digits in said guess match your secret number exactly in both digit and position (called "bulls") and how many digits match the secret
number but locate in the wrong position (called "cows"). Your friend will use successive guesses and hints to eventually derive the secret number.

For example:

Secret number:  "1807"
Friend‘s guess: "7810"

Hint: 1 bull
and 3 cows.
(The bull is 8,
the cows are 01 and 7.)

Write a function to return a hint according to the secret number and friend‘s guess, use A to
indicate the bulls and B to indicate the cows. In the above example, your function should
return "1A3B".

Please note that both secret number and friend‘s guess may contain duplicate digits, for example:

Secret number:  "1123"
Friend‘s guess: "0111"

In this case, the 1st 1 in
friend‘s guess is a bull, the 2nd or 3rd 1 is
a cow, and your function should return "1A1B".

You may assume that the secret number and your friend‘s guess only contain digits, and their lengths are always equal.

思路:

本题属于hashmap tag,我考虑问题的时候无脑强行用了hashmap,结果代码写的很长,不过思路很清晰也简单,网上有更简洁的解法。

用两个hashmap保存guess和secret字符情况,先求bull,后对剩下的字符比较求cow。

算法

[java] view
plain
 copy

  1. public String getHint(String secret, String guess) {
  2. String hint = "";
  3. int bull = 0, cow = 0;
  4. HashMap<Character, Integer> map = new HashMap<Character, Integer>();
  5. HashMap<Character, Integer> gmap = new HashMap<Character, Integer>();
  6. for (int i = 0; i < secret.length(); i++) {
  7. char ssecret = secret.charAt(i);
  8. char cguess = guess.charAt(i);
  9. if (map.containsKey(ssecret)) {
  10. map.put(ssecret, map.get(ssecret) + 1);
  11. } else {
  12. map.put(ssecret, 1);
  13. }
  14. if (gmap.containsKey(cguess)) {
  15. gmap.put(cguess, gmap.get(cguess) + 1);
  16. } else {
  17. gmap.put(cguess, 1);
  18. }
  19. }
  20. for (int i = 0; i < secret.length(); i++) {// 求bull
  21. char ssecret = secret.charAt(i);
  22. char cguess = guess.charAt(i);
  23. if (ssecret == cguess) {
  24. bull++;
  25. map.put(ssecret, map.get(ssecret) - 1);
  26. gmap.put(ssecret, gmap.get(ssecret) - 1);
  27. }
  28. }
  29. Iterator<Character> it = map.keySet().iterator();
  30. while (it.hasNext()) { //求cow,对secret中非bull字符判断是否存在于guess剩下字符中
  31. char c = it.next();
  32. while (map.get(c) > 0) { // 如果c是非bull字符
  33. if (gmap.containsKey(c) && gmap.get(c) > 0) {//如果guess剩下还有c字符
  34. cow++;
  35. map.put(c, map.get(c) - 1);
  36. gmap.put(c, gmap.get(c) - 1);
  37. } else {
  38. break;
  39. }
  40. }
  41. }
  42. return hint + bull + "A" + cow + "B";
  43. }
时间: 2024-08-02 23:03:06

【Leetcode】Bulls and Cows的相关文章

【LeetCode】哈希表 hash_table(共88题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target . 题解:我这次最大范围的优化代码, hash-table + one pass,时间复杂度 O(N),空间复杂度 O(N).重点在于动态找,一边生成hash-tabl

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

【LeetCode】Pascal&#39;s Triangle

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这题别想用通项公式做,n choose m里面的连乘必然溢出,老老实实逐层用定义做. class Solution { public: vector<vector<

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【leetcode】Max Points on a Line (python)

给定一个点,除该点之外的其他所有点中,与该点的关系要么是共线,要么就是共点,也就是两点重合. 共线有三种情况:水平共线,垂直共线,倾斜的共线.合并下这三种情况就是斜率存在的共线和斜率不存在的共线. 那么我们的任务就是针对每个点,找出与其共线的这些情况中,共线最多的点的个数. 注意:最终的结果别忘了加上共点的个数. class Solution: def maxPoints(self, points ): if len( points ) <= 1: return len( points ) ma

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu

【Leetcode】Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string. If the last word does not exist, return 0. Note: A word is defined as a character sequence consists of non-space cha