蓝桥杯第六天

哈希算法

两数的和

两个数的和:数学课上,老师出了一道题目木。要求在给定的一些数字中找出两个数,使得他们的和为N,前提是这些数据中保证有答案,并且只有一个答案。例如给定五个数字:3,4,5,7,10.从中选出两个数是他们的和为“11”这个问题该如何解决?使用链表地址发解决哈希表的冲突
方法一:双指针法
def TowNums(nums,target):
    res=[]   #新建一个保存最终结果的数组
    newnums=nums[:]   #将数组nums复制,新复制的数组名为mewnums
    print(newnums)
    newnums.sort()      #数组内数字进行排序(由小到大)
    left=0                #左指针
    right = len(newnums)-1   #右指针
    while left < right:      #循环的条件左指针小于右指针
        if newnums[left]+newnums[right]==target:   #如果找到这两个数
            for i in range(0,len(nums)):
                if nums[i] == newnums[left]:    #保存数的下标
                    res.append(i)  
                if nums[i] == newnums[right]:
                    res.append(i)
            break
        elif  newnums[left]+newnums[right]<target:   #如果两数的和小于目标数,左指针向右移一位
            left+=1
        elif  newnums[left]+newnums[right]>target:   #如果两数的和大于目标数,右指针向左移一位
            right-=1
    return(res[0]+1,res[1]+1)
nums=[4,7,3,5,10]
target=13
TowNums(nums,target)

运行结果

#方法二:哈希算法
def twonums(nums,target):
    dict={}
    for i in range(len(nums)):
        m=nums[i]
        if target-m in dict:
            return (dict[target-m]+1,i+1)
        dict[m]=i

twonums(nums,target)
#以“target=13”为例:当算法遍历到3的时候,已经把3:2存入字典中了(其中3为key,2(下标)为value)。当遍历到10时,因为13-10即3已经在dict
#中,满足条件,直接返回位置即可。

运行结果

单词模式匹配

#单词模式匹配
#考虑多种不匹配的模式,一对多,多对一
def wordpattern(wordpattern,ip):
    word = ip.split(' ')
    hash1={}
    used={}
    if len(word) != len(wordpattern):    #如果单词模式和目标字符串长度不一样,则肯定不匹配
        return False
    for i in range(len(wordpattern)):
        if wordpattern[i] in hash1:
            if hash1[wordpattern[i]] != word[i]:         #一对多,同一个目标字符对应多个单词
                return False
        else:
            if word[i] in used:                          
                return False
            hash1[wordpattern[i]]=word[i]
            used[word[i]] = True
    return True
wp=['一','二','一','二']
input1='苹果 香蕉 苹果 香蕉'
print(wordpattern(wp,input1))

运行结果

猜词游戏

猜词游戏
def gethint(secert,guess):
    A,B=0,0
    secert_dict={}
    guess_dict={}
    for i in range(len(secert)):
        if secert[i]==guess[i]:
            A+=1
        else:
            if secert[i] in secert_dict:
                secert_dict[secert[i]]+=1
            else:
                secert_dict[secert[i]]=1
            if guess[i] in guess_dict:
                guess_dict[guess[i]]+=1
            else:
                guess_dict[guess[i]]=1
    for digit in secert_dict:
        if digit in guess_dict:
            B+=min(secert_dict[digit],guess_dict[digit])
    return str(A)+'A'+str(B)+'B'
s='1123'
g='9115'
gethint(s,g)

运行结果

神奇的词根

#神奇的词根
import collections
def repalceword(dict,sentence):
    d=collections.defaultdict(set)
    s=collections.defaultdict(int)
    sentence=sentence.split(' ')
    for w in dict:
        print(w[0])
        d[w[0]].add(w)
        s[w[0]]=max(s[w[0]],len(w))
    for i,w in enumerate(sentence):
        for j in range(s[w[0]]):
            if w[:j+1] in d[w[0]]:
                sentence[i]=w[:j+1]
                break
    return ' '.join(sentence) 
dic=['cat','bat','rat']
se='the cattle was rattled by the battery'
repalceword(dic,se)

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值