iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

觀前提醒:

  1. 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法
  2. 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
  3. 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
  4. 若對於解法不太懂,可以嘗試用 Chrome 的 debugger 來試跑看看 (教學文)
  5. 最後,歡迎在下面留言指教~教學相長才會進步歐~/images/emoticon/emoticon41.gif

題目

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:

Input: "race a car"
Output: false

Constraints:

s consists only of printable ASCII characters.

解題想法(含調用函式)

  1. 整個字串通通轉小寫--String.prototype.toLowerCase()
  2. 取代非文字部分(其概念還有包含ASCII 碼的可顯示字元的技巧,故下方一並奉上)
  3. 反轉(這像是一套組合拳,要先split,reverse,最後再 join)
  4. 確認 revNewS 跟 newS 是否相符 (僅條件式判斷,無調用內建函式)

CODE

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function (s) {
  const n = s.length;
  if (n === 0) {
    return true;
  }
  // 轉小寫
  s = s.toLowerCase();
  // 取代非文字部分
  let newS = "";
  for (let i = 0; i < s.length; i++) {
    if (s.charCodeAt(i) >= 97 && s.charCodeAt(i) <= 122) {
      newS += s[i];
    } else if (s.charCodeAt(i) >= 48 && s.charCodeAt(i) <= 57) {
      newS += s[i];
    }
  }
  // 反轉
  let revNewS = newS.split("").reverse().join("");
  if (revNewS === newS) {
    return true;
  } else {
    return false;
  }
};

心得

這題簡單說,對我來講就是直接一步步拆解,然後看著"OOO / 481 test cases passed.",那個通過數量上升,來判斷自己的CODE有沒有過這樣~/images/emoticon/emoticon01.gif


謝謝大家的收看,LeetCode 小學堂我們下次見~/images/emoticon/emoticon29.gif


上一篇
[LeetCode with JavaScript] Day 9: Plus One
下一篇
[LeetCode with JavaScript] Day 11: Roman to Integer
系列文
[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言