Image From LeetCodeImage From LeetCode

今天我們要講解的是 [Palindrome Number],這在 LeetCode 算是比較簡單的題目,讓我們一起開始吧!

進來之前請先注意,我的方式不一定完全正確,只是依照我自己的理念進行撰寫,所以如果程式上有什麼更好的解法,歡迎提出見解。

這次題目

Given an integer x, return true if x is a palindrome, and false otherwise.

Example

1
2
3
Input: x = 121
Output: true
Explanation: 121 reads as 121 from left to right and from right to left.
1
2
3
Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
1
2
3
Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Follow up: Could you solve it without converting the integer to a string?

自已解法

這次主要是一個判斷回文的題目,簡單的解法,可以先把字串轉為陣列接著進行反轉,接著變回字串來進行判斷,大概的解法如下:

1
2
3
4
5
6
7
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
return x === parseFloat(x.toString().split('').reverse().join(''));
}

不過他有提供另一個小挑戰,希望能不轉為字串的情況下進行判斷,首先我們先排除0以下的,即可直接返回false,接著我們把x代入到number的參數裡,接著建立一個相反值rever為0,這部分我們之後會用到。

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
} else {
let number = x;
let rever = 0;
}
}

接著我們思路是,可以透過取餘數%10的方式去抓原本number最後一個值放進rever,接著再把最後一個值拿掉,藉由Math.floor(number/10),強制把小數點拿掉,例如125 => 12.5 => 12,完成後把算出來的值放進number,到下一輪時我們在重複上個動作,直到我們把number變為0即可獲得反轉後的數字,最後我們在進行判斷即可。

然而下方每次rever*10,這主要為了讓數字往前推,例如上面 125%10 => 5,接著下一階段12%10 => 2,我們必須要把上一階段的5往前推,所以透過*10可以達到我們要的目的: (5*10) + 2 = 52

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
} else {
let number = x;
let rever = 0;
while(number > 0) {
rever = (rever * 10) + (number % 10)
number = Math.floor(number / 10);
}
return x === rever;
}
}

實作結果

如此一來就完成了!

Image From LeetCodeImage From LeetCode