ItIron2021
Javascript
終於最後一天啦,實際上寫了幾篇之後我就發現這主題沒有我想像中的好發揮,實際在模擬面試的活動中我可以針對同學的回答進行補充或是追問,也可以比較清楚知道我需要再多講解哪些部份的概念,不過當轉換成單向的文字時就沒有這麼自由了,許多篇文章現在回頭看起來都覺得講得過淺,有很大的進步空間,之後如果要做這樣的活動紀錄我會再想其他辦法的!
現在就讓我們來看最後一題吧!
請寫一個簡單的函數檢測輸入的字串是否為回文(palindrome)
最後一張的防雷圖!
有在刷leetcode的朋友對這題目一定不陌生,我記得它甚至分成4個題目讓你挑戰,總之經過前面的鍛鍊,我想你知道你需要先釐清問題!你可能會追問以下的問題
很好、很全面的追問,因此面試官替你進一步說明了題目。
所謂回文是指該字串從頭到尾、從尾到頭都是相同的文字排序,在這次的情境中,請你忽略大小寫以及特殊文字(也就是除了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、正規表達式
本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!