↑看個小廣告,支持好內容↑
從題意可以了解:不論 ch
出現多少遍,要反轉的都是它首次出現前的那些字母,顯然第一次出現的位置就很關鍵了。
拆成兩個任務來辦,首先找出第一次發現 ch
的位置,再針對範圍去做 reverse:
1. index=word.indexOf(ch)。
2. 判斷是否需反轉
- 當 i<=index:res=word[i]+res (要反轉,從頭寫入)
- 當 i> index:res=res+word[i] (不反轉,從尾寫入)
別忘了,這是建立在有找到 ch 的狀況下。如果都沒有出現,要輸出原字串,可別傻傻把整個字串反轉了。
+reverse()
可能有的人會想到 reverse,但那個是陣列的方法,要用的話得轉型別:
// 反轉 word[0]~word[index]
word.substr(0, index+1).split("").reverse().join("")
上述的解法要說美中不足,就是 indexOf 會多遍歷一次陣列 O(2n)
,能不能只跑一次就完成反轉呢?
我們可以設立一個 Flag
標示是否已找到 ch
,依此來決定反轉字元與否。要是到最後都還沒找到,這個標記也能提醒我們該輸出原字串:
var reversePrefix = function(word, ch) {
let find=false;
let res="";
for(let i=0; i<word.length; i++){
if(!find){
res=word[i]+res;
if(word[i]==ch){find=true};
}else{
res=res+word[i];
}
}
// 如果還沒找到,就輸出原字串
return !find? word: res;
};
Two Pointers
、String
86.1%
❤️ 若內容對你實用,歡迎追蹤本專題,或小額贊助支持~
⭐ 這是我的第 23 篇刷題筆記,完整解題索引看這裡 → Here