leetcode -- Bulls and Cows -- 难理解题意,要看

来源:互联网 发布:房地产中介必备软件 编辑:程序博客网 时间:2024/06/13 15:51

https://leetcode.com/problems/bulls-and-cows/

这里要注意重复的问题。要首先计算bull,然后再计算cow,被match过得secret digit不能再被用来计算cow。这一点要注意

最后一种方法最好理解

my code效率很低

class Solution(object):    def getHint(self, secret, guess):        """        :type secret: str        :type guess: str        :rtype: str        """        mydict1, mydict2 = {},{}        for i in xrange(len(secret)):            if secret[i] in mydict1:                mydict1[secret[i]].append(i)                mydict2[secret[i]] += 1            else:                mydict1[secret[i]] = [i]                mydict2[secret[i]] = 1        bull,cow = 0,0        # calculate the bull first and then calculate the cow        for i in xrange(len(guess)):            if guess[i] in mydict1:                if i in mydict1[guess[i]]:                    bull += 1                    mydict2[guess[i]] -= 1        for i in xrange(len(guess)):            if guess[i] in mydict1:                if mydict2[guess[i]] > 0 and i not in mydict1[guess[i]]:                    cow += 1                    mydict2[guess[i]] -= 1        return str(bull) + 'A' + str(cow) + 'B'

更简单的办法是http://bookshadow.com/weblog/2015/10/31/leetcode-bulls-and-cows/

bulls = sum(map(operator.eq, secret, guess))#来计算bull最有效

这个办法也不错
http://www.hrwhisper.me/leetcode-bulls-and-cows/

这里先把bull算出来,并用digit作为hash map counter来计算在secret中除了已经被bull match的secret[i]以外,有哪些数字,其对应的occurence的次数是多少。然后再scan guess 排除掉被bull match的guess[i]然后再看digit里面对应的guess[i]是不是大于0,如果是就算一次cow

class Solution(object):    def getHint(self, secret, guess):        """        :type secret: str        :type guess: str        :rtype: str        """        if not secret or not guess: return '0A0B'        bulls, cows, digits = 0, 0, [0 ] * 10        for i in xrange(len(secret)):            if secret[i] == guess[i]:                bulls += 1            else:                digits[int(secret[i])] += 1        for i in xrange(len(secret)):            if secret[i] != guess[i] and digits[int(guess[i])] != 0:#注意这里是求guess[i]的value                cows += 1                digits[int(guess[i])] -= 1        return str(bulls) + 'A' + str(cows) + 'B'

自己重写code

class Solution(object):    def getHint(self, secret, guess):        """        :type secret: str        :type guess: str        :rtype: str        """        digit = {}        bull = 0        for i in xrange(len(secret)):            if guess[i] == secret[i]:                bull += 1            else:                if guess[i] not in digit:                    digit[guess[i]] = 1                else:                    digit[guess[i]] += 1        cow = 0        for i in xrange(len(secret)):            if guess[i] != secret[i] and secret[i] in digit and digit[secret[i]]>0:               digit[secret[i]] -= 1               cow += 1        return str(bull) + 'A' + str(cow) + 'B'
0 0
原创粉丝点击