題目:
輸入一串資料,刪除重複的資料。注意:讀取字串的順序為從右往左,如果結果是以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.附加題 刪除小寫字母字串中重複字元。如果可...