哈希算法--猜数字游戏

1.题目要求

输入两个位数相同的数,判断对应位置的数字是否相等,返回两个数。第一个数是数字和位置完全猜对的数字个数,第二个数是数字大小猜对但位置不对的数字个数

2.逐步编程

2.1 定义函数

def g(secret,guess):
    sec_dic={}
    gue_dic={}
    # 定义两个字典,记录每个数组中数字出现的个数

    count1=0
    # 记录完全才对的数的个数
    count2=0
    # 记录大小猜对但位置不对的个数

2.2 遍历判断

    for i in range(len(secret)):
        if secret[i]==guess[i]:
            count1+=1
            # 如果位置和大小对应相等,count1数量加1
        else:
            if secret[i] in sec_dic:
                sec_dic[secret[i]]+=1
                # 若该数字包含在字典中,计数加1
            else:
                sec_dic[secret[i]]=1
                # 否则在字典中新建此数,初始数量为1

            if guess[i] in gue_dic:
                gue_dic[guess[i]]+=1
            else:
                gue_dic[guess[i]]=1

2.3 对count2取值

对于秘密数字1123,猜测数字9111 ,count2的数字为1。为什么呢?在秘密数字中,第2个已经算作全对的数量,而第1个数字1只能和猜测数字中的两个1中的某个对应,也就是说,最终只是数字对的数量是由该数在秘密数字中和在猜测数字中更小的那一个决定。为此,只需要记录秘密数字和猜测数字中未匹配的数字和它的个数,之后看相同数字的最小数即可。

    for j in sec_dic:
        if j in gue_dic:
        # 此数在两个字典中都存在
            count2+=min(sec_dic[j],gue_dic[j])
    return str(count1)+','+str(count2)

3.完整代码

def g(secret,guess):
    sec_dic={}
    gue_dic={}
    count1=0
    count2=0
    for i in range(len(secret)):
        if secret[i]==guess[i]:
            count1+=1
        else:
            if secret[i] in sec_dic:
                sec_dic[secret[i]]+=1
            else:
                sec_dic[secret[i]]=1
            if guess[i] in gue_dic:
                gue_dic[guess[i]]+=1
            else:
                gue_dic[guess[i]]=1
    for j in sec_dic:
        if j in gue_dic:
            count2+=min(sec_dic[j],gue_dic[j])
    return str(count1)+','+str(count2)
print(g([1,2,2,2,1,1],[8,2,1,1,0,0]))

4.过程解析

def g(secret,guess):
    sec_dic={}
    gue_dic={}
    count1=0
    count2=0
    for i in range(len(secret)):
        if secret[i]==guess[i]:
            count1+=1
        else:
            if secret[i] in sec_dic:
                sec_dic[secret[i]]+=1
                print(sec_dic,'sec_dic')
            else:
                sec_dic[secret[i]]=1
                print(sec_dic,'sec_dic')
            if guess[i] in gue_dic:
                gue_dic[guess[i]]+=1
                print(gue_dic,'gue_dic')
            else:
                gue_dic[guess[i]]=1
                print(gue_dic,'gue_dic')
    for j in sec_dic:
        if j in gue_dic:
            count2+=min(sec_dic[j],gue_dic[j])
    return str(count1)+','+str(count2)
print(g([1,2,2,2,1,1],[8,2,1,1,0,0]))

# {1: 1} sec_dic
# {8: 1} gue_dic
# {1: 1, 2: 1} sec_dic
# {8: 1, 1: 1} gue_dic
# {1: 1, 2: 2} sec_dic
# {8: 1, 1: 2} gue_dic
# {1: 2, 2: 2} sec_dic
# {8: 1, 1: 2, 0: 1} gue_dic
# {1: 3, 2: 2} sec_dic        # 1的数量为3个
# {8: 1, 1: 2, 0: 2} gue_dic  # 1的数量为2个,返回最小值
# 1,2

5.补充:方法二

导入collections中的Counter

from collections import Counter
def g(secret,guess):
    count1=0
    count2=0
    for i in range(len(secret)):
        if secret[i]==guess[i]:
            count1+=1
            secret[i]='yes'
            guess[i]='no'
        else:
            a=Counter(secret)
            b=Counter(guess)
    for j in a:
        if j in b:
            count2+=min(a[j],b[j])
    # print(a)
    # print(b)
    return str(count1) + ',' + str(count2)
print(g([1,2,2,2,1,1],[8,2,1,1,0,0]))
print(g([1,1,2,3],[9,1,1,1]))
print(g([8,0,0,0,1,7],[9,0,0,0,2,1]))
# 1,2
# 1,1
# 3,1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值