iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
Modern Web

每日挑戰,從Javascript面試題目了解一些你可能忽略的概念系列 第 30

每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 - Day30

tags: ItIron2021 Javascript

前言

終於最後一天啦,實際上寫了幾篇之後我就發現這主題沒有我想像中的好發揮,實際在模擬面試的活動中我可以針對同學的回答進行補充或是追問,也可以比較清楚知道我需要再多講解哪些部份的概念,不過當轉換成單向的文字時就沒有這麼自由了,許多篇文章現在回頭看起來都覺得講得過淺,有很大的進步空間,之後如果要做這樣的活動紀錄我會再想其他辦法的!
現在就讓我們來看最後一題吧!

本日題目與解釋

請寫一個簡單的函數檢測輸入的字串是否為回文(palindrome)

最後一張的防雷圖!

thinking-day30

有在刷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

了解之後我們就可以開始動手了,很明顯我們需要採取幾個步驟

  1. 將輸入的字串轉為大寫或小寫
  2. 排除掉不需要考慮的特殊字元
  3. 測試該字串是否反過來與原本相同

我們一步步來吧! 第一步我們就不說明了,先轉為大小寫這很容易

  • 將輸入的字串轉為大寫或小寫
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、正規表達式

總結

  • 了解在面對這類問題時,你的程式碼不一定要會動,只要能闡述你解題的邏輯即可

本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!


上一篇
每日挑戰,從Javascript面試題目了解一些你可能忽略的概念 - Day29
系列文
每日挑戰,從Javascript面試題目了解一些你可能忽略的概念30

尚未有邦友留言

立即登入留言