优化python代码以避免运行时错误

时间:2018-11-03 20:20:02

标签: python arrays string algorithm dictionary

给出一个可能多次出现相同字符的字符串,返回该字符串中任何指示字符的最接近相同字符。

给出查询的字符串数sn。在每个查询中,将为您提供一个字符的索引a(其中0 <= a <= |s|),并且需要打印同一字符的壁橱索引。如果有多个答案,请打印最小的答案。否则,请打印-1

例如,字符串s = 'youyouy',具有给定查询3:在索引0和6处有两个匹配的字符,每个3个字符,我们选择最小的一个,即0。

这是我的计划: 我把字符串放在字典中,键是字符串中不同的字母,值是字母对应的索引。当给出查询时,在字典中找到相应的字母并返回最接近查询的值。

def closest(s, queries):
    res = []
    dict2={}

     #dict2 - letter - indexs
    for i in range(len(s)):
       if s[i] not in dict2:
           dict2[s[i]]=[i]
       else:
           dict2[s[i]].append(i)

    for num in queries:
         #closet- denotes closet letter index
        closet = math.inf
        #num is out of range , append -1
        if num > (len(s)-1):
            res.append(-1)
            continue
        #this is the only one letter, append -1 
        letter=s[num]
        if len(dict2[letter])==1:
            res.append(-1)
            continue
        #temp = list for that letters    
        temp=dict2[s[num]]
        index=temp.index(num) . #in the list, letter index's index in list

        if index==0:
            closet=temp[1]
        elif index==(len(temp)-1):
            closet=temp[index-1]
        else:
            distance1=num-temp[index-1] .   #left
            distance2=temp[index+1]-num .   #right
            if distance1 <= distance2:
                closet=temp[index-1]
            else:
                closet=temp[index+1]

        if closet == math.inf:
            res.append(-1)
        else:
            res.append(closet)
    return res  

我遇到两个运行时错误。我想知道您是否可以帮助我减少一些运行时间?

此外,我还在寻找其他建议!我已经使用Python一段时间了,并且正在寻找工作(大学新毕业生)。 Java运行速度通常比Python快吗?我应该切换到Java吗?

1 个答案:

答案 0 :(得分:0)

我正在尝试尽可能简单地做,但是我看起来有点复杂。尽管您的问题是避免运行时错误,但我想提出我的想法

s='oooyyouoy'
k='0123456789'
def cloest(string,pos):
    c = string[pos]
    p1 , p2 = s[:pos] , s[pos+1:]

    # reserve left part and find the closet one , add 1 because len(p1)=final_position + 1
    l = len(p1) - (p1[::-1].find(c) + 1) 
    # find without reserve and add 1 because s[pos+1:]
    r = (p2.find(c) + 1) + pos 

    # judge which one is closer if same chose left one
    result = l if (pos - l) <= (r - pos) else r 
    if result == pos:
        return -1
    else:
        return result

print(cloest(s,4))