1 整數反轉思路及解決方案

2021-10-20 19:35:19 字數 3722 閱讀 5875

1.理解題意

逆序輸出

首尾交換

2.資料結構及演算法思維選擇

1.逆序輸出

1.整數轉字串,字串轉陣列

2.資料結構:字元陣列

3.演算法思維:遍歷

2.首尾交換

1.整數轉字串,字串轉陣列

2.資料結構:字元陣列

3.演算法思維:遍歷

3.基本解法及編碼實現

1.暴力解法

1.整數轉字串,再轉字元陣列

2.反向遍歷字元陣列,並將元素儲存到新陣列

3.將新陣列轉換成字串,再轉成整數輸出

2.暴力解法邊界和細節問題

1.陣列索引越界

2.數值溢位邊界:溢位則返回0

3.首位不為0

4.符號處理

3.暴力解法編碼實現

class solution {

public int reverse(int x) {

if (x == integer.max_value || x == integer.min_value) {

return 0;

int sign = x > 0 ? 1 : -1;

x = x < 0 ? -x : x;

//1.將整數轉為字串,並將字串轉為陣列

string str = string.valueof(x);

char chararray = str.tochararray();

//2.迴圈遍歷字串陣列,將陣列元素放入新陣列

int length = chararray.length;

char array = new char[length];

for (int i = 0; i < array.length; i++) {

array[i] = chararray[length - 1 - i];

//3.將新陣列轉為字串,將字串轉為數字

long value = long.valueof(string.valueof(array));

boolean flag = value > integer.max_value || value < integer.min_value;

int result = flag ? 0 : (int) value;

return result * sign;

4.首尾交換(優化解法)

1.整數轉字串,再轉字元陣列

2.交換首位和末位數字

3.迴圈操作,依次交換,直到陣列剩下1個或0個元素

4.將原陣列轉換成字串,再轉成整數輸出

5.優化解法邊界和細節問題

1.陣列索引越界:陣列長度為偶數,反轉完成標誌為start>end,陣列長度為奇數,反轉完成標誌為start==end

2.數值溢位邊界:溢位則返回0

3.首位不為0

4.符號處理

6.優化解法編碼實現

class solution {

public int reverse(int x) {

if (x == integer.max_value || x == integer.min_value) {

return 0;

int sign = x > 0 ? 1 : -1;

x = x < 0 ? -x : x;

//1.將整數轉為字串,並將字串轉為陣列

string str = string.valueof(x);

char chararray = str.tochararray();

//2.迴圈交換首位和末位數字

//3.迴圈操作,依次交換,直到陣列剩下1個或0個元素

int start = 0, end = chararray.length - 1;

while (start < end) {

char temp = chararray[start];

chararray[start] = chararray[end];

chararray[end] = temp;

start++;

end--;

//3.將新陣列轉為字串,將字串轉為數字

//long value = long.valueof(string.valueof(array));

long value = long.valueof(string.valueof(chararray));

boolean flag = value > integer.max_value || value < integer.min_value;

int result = flag ? 0 : (int) value;

return result * sign;

4.思考更優解

1.剔除無效**或優化空間消耗

1.操作時必須的麼

2.資料結構是必須的麼

2.尋找更好的演算法思維

1.既然是整數,能否用數學思維

2.借鑑其他演算法

5.最優解思路及編碼實現

1.數學思維解法

1.嘗試拿個位數字

對10取模運算得到個位數字

2.讓每一位數字變成個位數字

先除以10,再對10取模得到十位數字

迴圈上述操作

3.將每一位數字計算累加

將上次累加結果*10 + 新數字

2.邊界問題及細節問題

1.從低位到高位處理,最高位結束

最高位/10==0

最高位%10==最高位

2.數值溢位邊界:溢位則返回0

用long型別存放,溢位int則返回0

新整數補充最後一位前判斷溢位

3.首位不為0

4.符號處理

3.最優解編碼實現

class solution {

public int reverse(int x) {

if (x == integer.max_value || x == integer.min_value) {

return 0;

int sign = x > 0 ? 1 : -1;

x = x < 0 ? -x : x;

//1.對10取模運算得到個位數字

//2.讓每一位數字變成個位數字,先除以10,再對10取模得到十位數字

int result = 0;

int last = 0;

while ((last = x % 10) != x) {

result = result * 10 + last;

x /= 10;

if (last != 0) {

long re = result;

re = re * 10 + last;

if (re > integer.max_value || re < integer.min_value)

result = 0;

else

result = (int) re;

return result * sign;

6.總結

1.演算法思維

遍歷逆序

原地交換

數學思維:取模、累加

2.資料結構:陣列

1.陣列容量固定不變,需要在建立時指定

2.使用連續的物理空間儲存叔叔

3.可以通過下標在o(1)的時間複雜度下讀取資料

優先順序反轉及解決方案

原文 1.優先順序反轉 priority inversion 由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉 priority inversion 2.產生原因 其實,優先順序反轉是在高優級 ...

電子簽名實現的思路 困難及解決方案

過載 根據xml字串產生動態控制項,顯示所有字段 布局有一些預設屬性 不再設為類的屬性,那樣就要求建立物件並保持 根據當前使用者決定是否有許可權操作operator 下拉列表額外增加了乙個空值 static public void createcontrol string strxml,htmlco...

電子簽名實現的思路 困難及解決方案

過載 根據xml字串產生動態控制項,顯示所有字段 布局有一些預設屬性 不再設為類的屬性,那樣就要求建立物件並保持 根據當前使用者決定是否有許可權操作operator 下拉列表額外增加了乙個空值 static public void createcontrol string strxml,htmlco...