iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
自我挑戰組

用LeetCode來訓練大腦的邏輯思維系列 第 1

LeetCode 9. Palindrome Number

  • 分享至 

  • xImage
  •  

題目

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

題意

判斷數值是否為迴文(palindrome)
迴文(palindrome)的定義是:一段文字不論由左至右或是由右至左讀取,內容都是一樣的。
不能將數值轉字串。

Example 1:

Input: 121
Output: true

Example 2:

Input: -121
Output: false

Example 3:

Input: 10
Output: false

解題步驟

這題其實很簡單,但題目有限制不能轉字串,所以跟字串有關的操作都不行,很明顯,就是要用數值的運算來解題。

12321為例,一開始要比較的是第一位(1)與最後一位(1)是否相等,思考的點在於我們要如何取得第一位與最後一位?

想到了嗎?就是使用/取商數,%取餘數,就可以取得我們要的數值了。
OK,找到關鍵點後,開始來設計流程,x為參數。

首先,有負號的一定不行,先過濾掉:

if (x < 0) {
  return false;
}

假設x=12321
取得x第一位(1)就要除以10000取商數,如果是1234321,就要除以1000000,問題在於,要如何得知被除數是多少呢?

只要商數大於等於10,就表示除數比被除數還要多位數,被除數要乘以10再比較,直到商數小於10為止。

先宣告一個代表被除數的變數div,再用迴圈去判斷它需要幾位數:

let div = 1;
while (x / div >= 10) {
  div *= 10;
}

所以,div就會是10000

那最後一位呢?就簡單許多,只要取除以10的餘數就好。

比較完後,假設都相同,就進行下一輪的比較,因為剛剛比較過的那些數字都不需要了,x12321變成232

要如何變成232?先去尾,除以10,再用Math.floor()回傳整數,變1232
去頭呢?再除以1000取餘數。

得到232後,再繼續剛剛的方式判斷,這時的div100

由以上的步驟可以找出重複的規律,迴圈就派上用場了。

重新整理上述的步驟:
只要x除以div的商等於x%10的餘數,就繼續判斷,不然則回傳false。

while () {
  if (Math.floor(x / div) === x % 10) {
    continue;
  } else {
    return false;
  }
}

繼續判斷後,x就要去頭去尾,div也要除以100

while () {
  if (Math.floor(x / div) === x % 10) {
    div /= 10;
    x = Math.floor(x / 10) % div;
    div /= 10;
    continue;
  } else {
    return false;
  }
}

最後while迴圈的判斷式要如何終止?
div下手,只要前後位的值相同,div為了下一次的判斷,會再除以100,所以到最後它一定會小於1,此時x已經剩1位數,也就表示無須再判斷了。

當完整跑完迴圈,就表示xpalindrome

Solution

var isPalindrome = function(x) {
  if (x < 0) {
  return false;
}
let div = 1;
while (x / div >= 10) {
  div *= 10;
}

while (div > 1) {
  if (Math.floor(x / div) === x % 10) {
    div /= 10;
    x = Math.floor(x / 10) % div;
    div /= 10;
    continue;
  } else {
    return false;
  }
}
return true;
};

下一篇
LeetCode 12. Integer to Roman
系列文
用LeetCode來訓練大腦的邏輯思維30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言