今天在力扣上碰到了一道題 寫一篇博客 順便練習一下markdown的語法
原題:
給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進行反轉(zhuǎn)。
注意:
假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [?231, 231 ? 1]。請根據(jù)這個假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
我的想法自然是轉(zhuǎn)成char[]數(shù)組 反轉(zhuǎn)數(shù)組再判斷有沒有越界
class Solution {
public static int reverse(int x) {
boolean positive = true;
char[] a = String.valueOf(x).toCharArray();
if ((int) a[0] == 45) {
positive = false;
a = Arrays.copyOfRange(a, 1, a.length);
}
System.out.println(Arrays.toString(a));
for (int i = 0; i < a.length / 2; i++) {
char b = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = b;
}
long c = Long.parseLong(new String(a));
if (positive) {
if (c > (1 << 31) - 1) {
return 0;
}
} else {
if (c > (1 << 31)) {
return 0;
}
return -(int) c;
}
return (int) c;
}
寫的麻煩了一點,可是一運行 輸入負數(shù) 答案卻出錯了 返回一個0,一檢查發(fā)現(xiàn)(1<<31)是一個負數(shù) int正整數(shù)最大取值是(1<<31)-1 int占4個字節(jié) 32位 最后一位是符號位 不注意經(jīng)常會出錯
可是要判斷負整數(shù)有沒有越界怎么辦呢?
我把判斷條件改成了c-1 > (1 << 31)-1, 結(jié)果正確了
然而提交的時候 卻提醒我編譯錯誤 不能返回(int)c ide中卻能正常運行 真是怪
我覺得是力扣的問題 用java經(jīng)常出錯
另一種思路:
這是我在評論區(qū)看的 很簡潔 :
public static int reverse(int x) {
int res = 0;
int of = ((1 << 31) - 1) / 10;
while (x != 0) {
if (Math.abs(res) > ((1 << 31) - 1) / 10) return 0;
System.out.println(res*10+"\t"+x%10 +"\t");
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
每輪都取最高位的數(shù)字 再做判斷是否越界
java中負數(shù)取值范圍比正數(shù)大一 我認為判斷絕對值有點問題?