來自 LIOJ 上的題目,因為第二種解法很有趣,但又怕我哪天就忘記了,所以特別開一篇文章來記錄。
方法一
這是我最直覺想到的方法,找出「頭跟尾的第一個出現非空白字元的索引值」:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| function trim(s) { let result = '' let first = 0 let last = s.length - 1
for(let i=0; i<s.length; i++) { if(s[i] !== ' ') { first = i break } } for(let i=s.length-1; i>=0; i--) { if(s[i] !== ' ') { last = i break } } for(let i=first; i<=last; i++) { result += s[i] } return result } console.log(trim(' abc ')) console.log(trim(' a b c ')) console.log(trim(' abc')) console.log(trim('abc '))
|
更簡潔的寫法
一樣的邏輯,但可以用內建函式來寫的更簡潔:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| function trim(str) { const strArr = str.split('')
const start = strArr.findIndex(elem => !(' ').includes(elem)) const end = strArr.reverse().findIndex(elem => !(' ').includes(elem)) return str.slice(start, str.length-end) } console.log(trim(' abc ')) console.log(trim(' a b c ')) console.log(trim(' abc')) console.log(trim('abc '))
|
方法二
這是參考別人後學到的解法,簡單來說就是「先把前面的空白去掉,再把後面的空白去掉」:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| function trim(s) { let isFrontWhiteSpaceFounded = false let isBackWhiteSpaceFounded = false let front = '' let back = '' for(let i=0; i<s.length; i++) { if(s[i] !== ' ' || isFrontWhiteSpaceFounded) { front += s[i] isFrontWhiteSpaceFounded = true } } for(let i=front.length-1; i>=0; i--) { if(front[i] !== ' ' || isBackWhiteSpaceFounded) { back = front[i] + back isBackWhiteSpaceFounded = true } } return back } console.log(trim(' abc ')) console.log(trim(' a b c ')) console.log(trim(' abc')) console.log(trim('abc '))
|
這解法看幾次都覺得神奇 Σ(°Д°;