tags: ItIron2021
Javascript
前言
終於最後一天啦,實際上寫了幾篇之後我就發現這主題沒有我想像中的好發揮,實際在模擬面試的活動中我可以針對同學的回答進行補充或是追問,也可以比較清楚知道我需要再多講解哪些部份的概念,不過當轉換成單向的文字時就沒有這麼自由了,許多篇文章現在回頭看起來都覺得講得過淺,有很大的進步空間,之後如果要做這樣的活動紀錄我會再想其他辦法的!
現在就讓我們來看最後一題吧!
本日題目與解釋
請寫一個簡單的函數檢測輸入的字串是否為回文(palindrome)
最後一張的防雷圖!

有在刷leetcode的朋友對這題目一定不陌生,我記得它甚至分成4個題目讓你挑戰,總之經過前面的鍛鍊,我想你知道你需要先釐清問題!你可能會追問以下的問題
- 什麼是回文?
- 這函數只要回傳一個Boolean即可嗎?
- 如果遇到空格或特殊符號要怎麼處理?
- 大小寫需要判別嗎?
很好、很全面的追問,因此面試官替你進一步說明了題目。
所謂回文是指該字串從頭到尾、從尾到頭都是相同的文字排序,在這次的情境中,請你忽略大小寫以及特殊文字(也就是除了a-z、數字以及_之外的字元),最終回傳一個Boolean判斷傳入的字串是否為回文
舉幾個例子來看
isPalindrome('I am a dog') // false 正反排序不相同
isPalindrome('I am a i') // true 不管大小寫、空格被忽略,正反都是iamai
isPalindrome('I @@am a i@') // true 特殊字元也被忽略,同上
isPalindrome('') // true
了解之後我們就可以開始動手了,很明顯我們需要採取幾個步驟
- 將輸入的字串轉為大寫或小寫
- 排除掉不需要考慮的特殊字元
- 測試該字串是否反過來與原本相同
我們一步步來吧! 第一步我們就不說明了,先轉為大小寫這很容易
- 將輸入的字串轉為大寫或小寫
str = str.toLowerCase()
- 先排除掉不需要考慮的特殊字元
這應該是這幾個步驟中比較困難的一個,但很多時候你在遇到這樣的題目時,你的程式碼不一定要會動,關鍵其實在於你能不能清楚的表達你的解題思路,排除掉特殊字元的方法有很多,最土法煉鋼的自然是自己定義後再利用迴圈排除囉!
const validElements = 'abcdefghijklmnopqrstuvwxyz0123456789_'.split("")
const filteredStr = str.split("").filter(item => validElements.includes(item)).join("")
當然,你也可以用正規表達式,題目具體到不用正規表達式都有些奇怪了😉
str = str.replace(/\W/g, '').toLowerCase();
- 測試該字串是否反過來與原本相同
最後一個步驟你可以選用迴圈比較頭尾是不是都相同,一旦不相同就回傳false,是個好辦法!
function isPalindrome(str) {
str = str.toLowerCase()
const validElements = 'abcdefghijklmnopqrstuvwxyz0123456789_'.split("")
const filteredStr = str.split("").filter(item => validElements.includes(item)).join("")
// 加入這邊
for (let i = 0; i < Math.floor(filteredStr.length / 2); i++) {
if (filteredStr[i] !== filteredStr[filteredStr.length - i -1]) {
return false
}
}
return true
}
或是善用原本Array.reverse()方法,配合之前說的正規表達式就會是這樣
function isPalindrome(str) {
str = str.replace(/\W/g, '').toLowerCase();
return (str == str.split('').reverse().join(''));
}
本日核心觀念與總結
核心觀念
palindrome、正規表達式
總結
- 了解在面對這類問題時,你的程式碼不一定要會動,只要能闡述你解題的邏輯即可