01
題目資訊
給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123輸出: 321
示例 2:
輸入: -123輸出: -321
示例 3:
輸入: 120輸出: 21
注意:假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−2^31, 2^31 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
02解法一:暴力解法
主體
整數轉字串
字串的反轉
字串轉整數
邊界
細節
public int reverse(int x)
//3.字串轉整數
//integer result = integer.valueof(string.valueof(array));
long value = long.valueof(string.valueof(array));
boolean b = value > integer.max_value || value < integer.min_value;
int result = b ? 0 : (int)value;
return result;
}
在上述**中已經完成主體**以及反轉後的數值越出邊界的問題,首位不為零問題:integer將整數字串轉整數時會自動去掉前面如果有高位的0。那麼還剩下符號處理整數x如果是-123,反轉字串是"321-"肯定是不能的。要把負號拿出來之後的數字參與主體過程,最後再把結果加上負號。
//拿走符號sign
int sign = x > 0 ? 1 : -1;
//剩下絕對值
x = x < 0 ? x * -1 : x;
讓處理之後的x參與主體**,最後返回值加上符號
return result * sign;
但上面拿絕對值的這個步驟是有問題的,因為最小值的絕對值是比最大值要大1的。當傳入的int x = integer.min_value時絕對值超過了int的範圍。因此在符號拿取之前先進行判斷,把極值(包括最大值)直接返回掉畢竟它們反轉之後數字大小一定是溢位沒必要經過主體三步之後在判斷是否返回0。
public int reverse(int x)
//符號處理
int sign = x > 0 ? 1 : -1;
x = x < 0 ? x * -1 : x;
//1.整數轉字串
string str = "" + x;
char s = str.tochararray();
//2.字串的反轉
int n = s.length;
for(int i = 0; i < n/2; i++)
//3.字串轉整數
//integer result = integer.valueof(string.valueof(array));
long value = long.valueof(string.valueof(s));
boolean b = value > integer.max_value || value < integer.min_value;
int result = b ? 0 : (int)value;
//加上符號
return result * sign;
}
時間複雜度o(n),空間複雜度o(n)
03解法二:數學思維
既然是把乙個整數變成另外乙個整數面對這樣的問題的完全可以找到數學的方式,在陣列裡我們使用索引指標取各個值,在數字裡面我們就可以用除法和取模運算來獲取各個值。上面我們陣列或者字串直接拼接各個字元。這裡我們就累加拼接。效率提公升乙個次元。
public int reverse(int x)
int result = 0;//返回結果
int last = 0;//末位
while((last = x % 10) != x)
//新增最後一位判斷溢位
long value = result;
value = value * 10 + last;
if(value > integer.max_value || value < integer.min_value)else
return result;
}
時間複雜度o(n),空間複雜度o(1)
04總結
總體上是兩種思路但可以優化的點還有一些比如個位判斷直接返回等等,這裡主要體會的是關於數字處理的相關演算法都是可以採用數學方式,它是遠遠比操作字元效率要高。第二就是關於實現主體與細節、邊界的乙個劃分,盡量降低耦合性。
abs 不會整數 方法 溢位 7 整數反轉
題目 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123輸出 321示例 2 輸入 123輸出 321示例 3 輸入 120輸出 21注意假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉後整數溢...
整數溢位,如何判斷整數溢位
c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...
整數溢位,如何判斷整數溢位
c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...