反直覺的正向迴圈
(i++)
刪除元素,看似不可取,但在某些時候恰到好處。
正向刪除可變迴圈物件,往往會產生不可期結果。
但採取類似回拔這種行為,來消除其副作用,在合適的時機,地點使用,會有情理之中的巧妙。
問題
給你一個字串 s,「k 倍重複項刪除操作」將會從 s 中選擇 k 個相鄰且相等的字母,並刪除它們,使被刪去的字串的左側和右側連在一起。
你需要對 s 重複進行無限次這樣的刪除操作,直到無法繼續為止。
在執行完所有刪除操作後,返回最終得到的字串。
輸入:s = "pbbcggttciiippooaais", k = 2
輸出:"ps"
來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/remove-al...
分析
- 本文用切片模擬棧的操作(list容器太重,麻煩)
- 一個充作計數器棧,一個為可變的位元組切片棧
- 在迴圈體內,位元組切片棧發生修改時,修正迴圈變數i差值
實現
func removeDuplicates(s string, k int) string {
cnt :=[]int{}
stack :=[]byte(s)
for i:=0;i<len(stack);i++{
if i==0 || stack[i]!=stack[i-1]{
cnt = append(cnt,1)
}else{
top := cnt[len(cnt)-1]
cnt = cnt[:len(cnt)-1]
if top+1==k{
stack = append(stack[:i-k+1],stack[i+1:]...)
i-=k
}else{
cnt = append(cnt,top+1)
}
}
}
return string(stack)
}
整理字串
一個由大小寫英文字母組成的字串 s
輸入:s = "abBAcC"
輸出:""
解釋:存在多種不同情況,但所有的情況都會導致相同的結果。例如:
"abBAcC" --> "aAcC" --> "cC" --> ""
"abBAcC" --> "abBA" --> "aA" --> ""
連結:leetcode-cn.com/problems/make-the-...
解析
- 同等字母字元大小寫差值32
- 回拔一個刪除位2,執行順序 自增,條件判定
- 注意陣列可能存在的越界情況
上碼
func makeGood(s string) string {
rs :=[]byte(s)
for i:=0;i<len(rs);i++{
if i>0 && (rs[i]+32 ==rs[i-1] || rs[i]==rs[i-1]+32){
if i+1 == len(rs){
rs = rs[:i-1]
}else{
rs = append(rs[:i-1],rs[i+1:]...)
}
i-=2
}
}
return string(rs)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結