python實現字串去重

2021-10-06 05:04:10 字數 1954 閱讀 5586

題目:

輸入一串資料,刪除重複的資料。注意:讀取字串的順序為從右往左,如果結果是以0結束,則刪除0;如果結果有負號』-』 需要保留

去重思路

對於不含符號的字串:「2343」——>轉化繫結(index,value)的元組列表[(0,2),(1,3),(2,4),(3,3)]——>按照value值排列[(0,2),(1,3),(3,3),(2,4)]——>遞迴去重,新增所檢查索引的標記flag=0(從flag=0開始檢查,那麼得從列表索引為1位置遍歷):1.如果索引i與flage儲存的元組的值(tuple[1])相等,且索引更大(tiple[0]),那麼i對應元素需要取代原flag位置的元組(此處下乙個迴圈檢查的仍然是flag位置的元組,因為還不能保證下乙個元組的值和flag位置儲存的不一樣);如果i與flag對應元素不等,那麼flag位置對應元素得到確認,下乙個flag+1的位置元組可以暫時儲存索引i的元組。——>後面就是按照tuple[0],即原索引的順序進行恢復,按要求倒取元素。

解題過程

def

solution

(string)

:# 確認結果符號

sign =

"-"if string[0]

=="-"

else

""# 根據需要去除字串符號位

string = string[1:

]if string[0]

=="-"

else string

# 將字串轉換為[(index,value)]的列表,以便對元素排序再去重,且最後根據index恢復

ls =

[(k, v)

for k, v in

enumerate

(string)

]# 按照value(字串中元素數值大小)正序排序

ls.sort(key=

lambda x: x[1]

)# 給去重索引作標記,而不需重新生成新的儲存空間

flag =

0# 從索引1位置遍歷列表元素,進行去重操作(確認index處的tuple)

for i in

range(1

,len

(ls)):

# 與前乙個索引對應的tuple中對應的字串元素比較:

# 如果索引i與flage儲存的元組的值(tuple[1])相等,且索引更大(tiple[0]),那麼i對應元素需要取代原flag位置的元組

# 果i與flag對應元素不等,那麼flag位置對應的元組得到確認,下乙個flag+1的位置元組可以暫時儲存索引i的元組

if ls[i][1

]== ls[flag][1

]and ls[i][0

]> ls[flag][0

]:ls[flag]

= ls[i]

if ls[i][1

]!= ls[flag][1

]:flag +=

1 ls[flag]

= ls[i]

# 保留的tuple應該是對應索引0-flag

ls = ls[

:flag+1]

# 將(index,value)元組按照字串元素索引大小倒排,恢復倒取元素的字串列表

ls.sort(key=

lambda x: x[0]

, reverse=

true

) ls =

[v[1

]for v in ls]

# 與符號位拼接

ret = sign +

"".join(ls)

# 結果有0,需要刪除(此處理解可能和題目要求有偏差)

if ret[-1

]=="0":

ret = ret[:-

1]return ret

備註:

因為注意點一說的很模糊,理解可能出現偏差,僅將去重思路作參考,這種思想可以應用在對陣列之類的序列去重上。

字串去重

字串去重,思路是在乙個字串例如 strstrrtsiiiinnnggggg 中,遍歷所有的字元,拼接到stringbuffer中。在執行速度上來看stringbuffer的拼接速度要快與string。通過str.charat i 的方法得到當前遍歷到的字元。通過indexof方法得到該字元第一次出現...

字串去重

doctype html en utf 8 viewport content width device width,initial scale 1.0 document title head 思路 1.宣告乙個空字元 2.將需要去重字元,乙個乙個新增到空字串中 條件 s裡面沒有這個字元,就加進去 v...

字串右旋 字串去重

1.將n個字元的陣列,迴圈右移k位。時間複雜度o n 實現思路 兩種實現思路 1.借助輔助空間,按照後面的順序進行拷貝,最後拷貝回字串 2.三次反轉法就可實現 include void rotatekth char str,int size,int k 2.附加題 刪除小寫字母字串中重複字元。如果可...