LeetCode集錦(二) - reverse integer
Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Example 2: Input: -123 Output: -321 Example 3: Input: 120 Output: 21 Note: Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows. 複製程式碼
翻譯:
給定一個32位帶符號整數,對其進行反數運算。
示例1:
輸入:123 輸出:321
示例2:
輸入:-123 輸出:-321
示例3:
輸入:120 輸出:21
注意: 假設我們處理的環境只能儲存32位帶符號整數範圍內的整數:[- 231,231 - 1]。對於這個問題,假設函式在反向整數溢位時返回0。
解題思路
本題字面含義其實是對一個整數進行反轉,這邊需要注意三個點:
- 帶符號
- 32位數字,反轉後可能會溢位
- 翻轉後開頭為0的要去掉。
思路一:我們可以利用String來進行直接的反轉,對目標數先取絕對值,然後翻轉,然後去掉頭部為0的數字,並且反轉完後把符號帶上,如果大於Integer,則返回0,這邊可以用long來代替,或者在轉化integer的時候進行異常捕獲
思路二:直接進行數字的翻轉,先取絕對值,一個個位數獲取下來,然後在拼接為最終結果,併除去頭部為0的值,最後賦予富豪,用long來代替,比較integer的最大值。
解題方法
-
第一種解體方法,按照我們的思路來編輯,程式碼如下
//首先把0特殊去掉 if (x == 0) { return 0; } //如果是負數,則變化成正數 int temp = x; boolean isMinus = false; if (x < 0) { temp = -temp; isMinus = true; } //翻轉, StringBuilder stringBuilder = new StringBuilder(temp+"").reverse(); //除去前面的0 int zoreCount = 0; for (int i = 0; i < stringBuilder.length(); i++) { if (stringBuilder.charAt(i) == '0') { zoreCount++; } else { break; } } if(zoreCount>0){ stringBuilder.delete(0,zoreCount); } try{ return Integer.valueOf(isMinus?"-"+stringBuilder.toString():stringBuilder.toString()); }catch (Exception e){ return 0; } 複製程式碼
時間複雜度: 該方案用了並沒有使用迴圈,其實在翻轉過程中應該是用來迴圈,但是這邊不計算,這邊在判斷頭部為0的情況下,迴圈來一次,所以記為n,所以f(n)=((log10(n)-1)+0)/2=log10(n)/2;所以O(f(n))=O(log10(n)),即T(log10(n))=O(n)
空間複雜度: 該方案使用了StringBuilder,相當於復刻了一個數組,所以空間複雜度是O(1);
-
第二種解題方法,程式碼如下:
//如果是負數,則變化成正數 long temp = x; boolean isMinus = false; if (x < 0) { temp = -temp; isMinus = true; } long value = 0; //獲取長度。 while (temp / 10 != 0 || temp % 10 != 0) { long remainder = temp % 10; value = value * 10 + remainder; if (value > Integer.MAX_VALUE) { return 0; } temp = temp / 10; } return (int) value * (isMinus ? -1 : 1); 複製程式碼
時間複雜度: 該方案用了單層迴圈,所以f(n)=(log10(n)+1)/2=log10(n)/2;所以O(f(n))=O(log10(n))=O(log10(n)),即T(n)=O(log10(n))
空間複雜度: 該方案並沒有使用額外的空間在儲存數值,所以為O(1);
總結
本題的大致解法如上所訴,方案2沒有利用到字串,直接由本身出發,空間和時間上都比方案一快,唯一一點是需要用long來控制,萬一int是負數最小值,一旦變成正數,就溢位了。