方法:反轉一半數字
思路映入腦海的第乙個想法是將數字轉換為字串,並檢查字串是否為回文。但是,這需要額外的非常量空間來建立問題描述中所不允許的字串。
第二個想法是將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是回文。
但是,如果反轉後的數字大於 \textint.max,我們將遇到整數溢位問題。
按照第二個想法,為了避免數字反轉可能導致的溢位問題,為什麼不考慮只反轉 \textint 數字的一半?畢竟,如果該數字是回文,其後半部分反轉後應該與原始數字的前半部分相同。
例如,輸入 1221,我們可以將數字 「1221」 的後半部分從 「21」 反轉為 「12」,並將其與前半部分 「12」 進行比較,因為二者相同,我們得知數字 1221 是回文。
讓我們看看如何將這個想法轉化為乙個演算法。
演算法首先,我們應該處理一些臨界情況。所有負數都不可能是回文,例如:-123 不是回文,因為 - 不等於 3。所以我們可以對所有負數返回 false。
現在,讓我們來考慮如何反轉後半部分的數字。
對於數字 1221,如果執行 1221 % 10,我們將得到最後一位數字 1,要得到倒數第二位數字,我們可以先通過除以 10 把最後一位數字從 1221 中移除,1221 / 10 = 122,再求出上一步結果除以 10 的餘數,122 % 10 = 2,就可以得到倒數第二位數字。如果我們把最後一位數字乘以 10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉後的數字。如果繼續這個過程,我們將得到更多位數的反轉數字。
現在的問題是,我們如何知道反轉數字的位數已經達到原始數字位數的一半?
我們將原始數字除以 10,然後給反轉後的數字乘上 10,所以,當原始數字小於反轉後的數字時,就意味著我們已經處理了一半位數的數字。
c#
public
class
solution
int revertednumber =0;
while
(x > revertednumber)
// 當數字長度為奇數時,我們可以通過 revertednumber/10 去除處於中位的數字。
// 例如,當輸入為 12321 時,在 while 迴圈的末尾我們可以得到 x = 12,revertednumber = 123,
// 由於處於中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除。
return x == revertednumber || x == revertednumber/10;
}}
複雜度分析
時間複雜度:o(\log_(n))o(log
10
(n)),對於每次迭代,我們會將輸入除以10,因此時間複雜度為 o(\log_(n))o(log
10
(n))。
空間複雜度:o(1)o(1)。
LeetCode 9 回文數(半數反轉)
很簡單就是判斷乙個整數是否是回文數 題目鏈結 那麼我們很容易想到,將這個整數轉化為單個的數字儲存到陣列中,類似於轉化為字串進行判斷,但是這種方法會耗費多餘的空間 思路 我們可以將這個整數一半的數字進行反轉,然後和這個整數前半部分進行比較,如果相同那麼就是回文數 這裡我們可以提前去除一些不可能的情況,...
LeetCode 9 回文數(簡單)
點此去做 題幹 判斷乙個整數是否是回文數。回文數是指正序和倒序都是一樣的整數。你能不將數字轉化為字串做嗎?輸入 121 121 10輸出 true false false執行用時 28ms,11.5mb 思想 最開始想要借用整數翻轉的 先將整數翻轉後再做相等比較,結果發現用例中有會造成溢位的大數,不...
陣列 Leetcode9回文數
leetcode9 判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 輸入 121 輸出 true 思路1 先變成字串然後對比 class solution return true 思路2 數字對比 class solution while num 0 r...