01題目資訊
給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−2^31, 2^31 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
02解法一:暴力解法
主體
整數轉字串
字串的反轉
字串轉整數
邊界
細節
public
intreverse(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
intreverse(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
intreverse(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總結總體上是兩種思路但可以優化的點還有一些比如個位判斷直接返回等等,這裡主要體會的是關於數字處理的相關演算法都是可以採用數學方式,它是遠遠比操作字元效率要高。第二就是關於實現主體與細節、邊界的乙個劃分,盡量降低耦合性。
LeetCode 初級演算法 字串
1.用的是遞迴方法,要注意邊界處理 2.比如n 4,則n 3時的序列稱為n 4的pre序列,用pre序列來 下乙個序列,也就是要對pre序列進行遍歷,對pre遍歷的過程中,因為用的是index和index 1進行對比,要設定乙個溢位的處理。public string countandsay int ...
Leetcode初級演算法
不是很難的一道動態規劃的題,感覺做多了就記住了。class solution return dp n 此題想法就是,只要後面買的減去前面買的能大於0,就算在內,每次買完和max比較,大於max就記錄為max,如果買的sum小於0了,重新開始買,sum記為0 class solution if sum...
LeetCode 反轉字串 初級演算法
題目 請編寫乙個函式,其功能是將輸入的字串反轉過來。示例 輸入 s hello 返回 olleh 思路 這個題感覺就是老生常談的題了,算是字串裡很簡單的題了,方法也比較多,我就寫幾個方法吧 第乙個 用字元指標來做,這是c裡的方法,思路很簡單,就是把原來的字串前後位置顛倒一下,交換下位置 如下 cha...