題目資訊
源地址:整數反轉
給你一個 32 位的有符號整數 x,回傳將 x 中的數字部分反轉后的結果,
如果反轉后整數超過 32 位的有符號整數的范圍 [?2^31, 2^31 ? 1] ,就回傳 0,
假設環境不允許存盤 64 位整數(有符號或無符號),
提示資訊
示例 1
輸入:x = 123
輸出:321
示例 2
輸入:x = -123
輸出:-321
示例 3
輸入:x = 120
輸出:21
示例 4
輸入:x = 0
輸出:0
提示
-2^31 <= x <= 2^31 - 1
實作邏輯
投機取巧
假設這道題目沒有環境不允許存盤 64 位整數(有符號或無符號)的限制,其實很容易解決,只是需要將數字轉換成正整數,然后從個位開始反轉,最后再根據原始整數的符號來設定結果整數的符號,
這種方法的缺陷就是,當數字較大時,需要使用到 64 位整數變數存盤結果整數,這樣肯定是不符合題目要求了,可以稱之為投機取巧,
package cn.fatedeity.algorithm.leetcode;
public class ReverseInteger {
public int answer(int x) {
long reverse = 0;
int rest = Math.abs(x);
while (rest >= 10) {
reverse = reverse * 10 + rest % 10;
rest = (int) (rest / 10.0);
}
reverse = reverse * 10 + rest;
if (x < 0) {
reverse = -reverse;
}
if (reverse < Integer.MIN_VALUE || reverse > Integer.MAX_VALUE) {
return 0;
}
return (int) reverse;
}
}
預判超量
這里的思路仍然是將數字從個位一點點轉換成結果整數,與投機取巧不同的是,需要預判結果整數是否超過了 32 位的有符號位整數,
package cn.fatedeity.algorithm.leetcode;
public class ReverseInteger {
public int answer(int x) {
int reverse = 0;
while (x != 0) {
// -2147483648 and 2147483647
if (reverse < Integer.MIN_VALUE / 10 || reverse > Integer.MAX_VALUE / 10) {
return 0;
}
reverse = reverse * 10 + x % 10;
x /= 10;
}
return reverse;
}
}
可能有人疑惑,為什么中途判斷的時候只需要是 \(\frac{1}{10}\) 即可,不需要再將 x % 10 的值算上,
其根本原因還是,給定的整數范圍是 [-2147483648, 2147483647],在這個范圍內,給定整數最高位只能是 2,得到的結果集最高位卻支持到 7,因此,個位上的比較也就不重要了,
首發于翔仔的個人博客,點擊查看更多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/500072.html
標籤:其他
上一篇:變頻器的四大組成部分和作業原理
下一篇:回溯演算法在點菜中的應用例子
