Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
判斷數值是否為迴文(palindrome)
,迴文(palindrome)
的定義是:一段文字不論由左至右或是由右至左讀取,內容都是一樣的。
不能將數值轉字串。
Input: 121
Output: true
Input: -121
Output: false
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
的餘數就好。
比較完後,假設都相同,就進行下一輪的比較,因為剛剛比較過的那些數字都不需要了,x
從12321
變成232
。
要如何變成232
?先去尾,除以10,再用Math.floor()
回傳整數,變1232
。
去頭呢?再除以1000
取餘數。
得到232
後,再繼續剛剛的方式判斷,這時的div
為100
。
由以上的步驟可以找出重複的規律,迴圈就派上用場了。
重新整理上述的步驟:
只要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位數,也就表示無須再判斷了。
當完整跑完迴圈,就表示x
是palindrome
。
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;
};