1. 程式人生 > >【程式碼】Python刷題

【程式碼】Python刷題

之前用C刷LeetCode,也就刷了60道吧,結果後來也不刷了。。。
現在主要用Python,刷一些題目熟悉語法,當然還有資料結構和演算法。

給定一個數組 strs,其中的資料都是字串,給定兩個字串 str1,str2。如果這兩個字串都在 strs陣列中,就返回它們之間的最小距離;如果其中任何一個不在裡面,則返回 -1;如果兩個字串相等,則返回 0。
例如:給定[‘’,’3’,’’,’5’,’10’,’9’,’7’,’1’,’’],再給定兩個字串’ ‘和’9’,通過函式求得返回值 3。

def min_distance(ss, s1, s2):
    if s1 not in ss or s2 not in ss:
        return -1
    if s1 == s2:
        return 0

    index1 = []
    for i in range(len(ss)):
        if ss[i] == s1:
            index1.append(i)

    index2 = []
    for i in range(len(ss)):
        if ss[i] == s2:
            index2.append(i)
    # 獲取兩個元素的索引,存入索引列表,並將其合併為一個索引總列表,並排序
    index3 = sorted(index1+index2)
    # 儲存索引差,即字串距離
    step = []
    for i in range(len(index3)-1):
        # 如果索引總列表中相鄰兩個元素索引分別為兩個元素的索引,則將其新增到索引差列表中
        if index3[i] in index1 and index3[i+1] in index2 or \
                index3[i] in index2 and index3[i+1] in index1:
            step.append(index3[i+1] - index3[i])

    # 找出索引差最小,即字串最小距離
    print(min(step))

測試用例:

s = ['*', '3', '*', '5', '10', '9', '7', '3', '*']
s11 = '3'
s22 = '9'
min_distance(s, s11, s22)

100 0000次執行,時間約為2.70s,原文程式碼為3.67s,使用標記的辦法改進,時間1.78s

def min_distance2(ss, s1, s2):
    if s1 not in ss or s2 not in ss:
        return -1
    if s1 == s2:
        return 0
    # 雙標記
    id1 = -1
    id2 = -1
    step = []
    for i in range(len(ss)):
        if ss[i] == s1:
            id1 = i
        elif ss[i] == s2:
            id2 = i
        if id1 == -1 or id2 == -1:
            continue
        else:
            # 雙標記的差的絕對值即為距離
            step.append(abs(id1-id2))
    # print(min(step))