資料結構與演算法 判斷乙個整數是否是回文數

2021-10-13 13:02:53 字數 1608 閱讀 6742

具體定義不多介紹;

/*

*  肯定不是回文的負數直接輸出false

* 考慮到程式的執行效率以及額外儲存空間和溢位等情況,所以採用首尾數字進行比較,即二分查詢;

* 首先想到int-->sting-->char陣列,但是因為要逆序儲存字串,造成了額外的儲存空間問題, 而且要實現型別轉換,過程複雜;

* 其次是直接把int逆序,然後比較是否相等,利用取餘和取整運算規則;但是當逆序以後的數字超出整形範圍以後,會出現整數溢位問題,即逆序以後的數字不是預期的結果,導致最後輸出false;

*  最後是採用二分法,首尾比較,相同就比較下一位,不相同直接false;

*/

提供後兩種解題思路的**:

對於拆解整數成分散的個位數,取模和取餘運算可以實現。

拆解右邊第乙個之後,在第二次拆解右邊第乙個時,把上一次的結果擴大十倍再加本次拆解的結果,最後判斷和原來值是否相等。

//整數逆序之後判斷是否相等

public static boolean intinverse(int x)

int a = x;

int y = 0;

while (x != 0)

return a==y;

}

第一步還是拆解整數,此時是拆解前後兩位,對這兩位進行比較,重複這個步驟;

拆解最高位的方式肯定還是取餘運算,重點在於除以多少,兩位數除以100,三位數除以1000.根據位數來確定除以多少。定義乙個整數用來表示初始值為1的被除數,用這個整數來和被除數取餘,每取餘一次,被除數乘以10一次,只要取餘結果小於10了,被除數大小就確定了。

重點在於:如果前後兩位相等時的捨棄以及被除數的變化;首先是被除數的變化,因為去掉了前後兩位,數量級變化為2,所以被除數也得縮小兩倍;然後是捨棄前後兩位,取模可以捨棄最高位,取餘可以捨棄最低位,即取餘和取模要同時進行:用被除數取餘之後的結果再取模;

//採用二分思想,判斷前後兩位是否相等,相等就捨棄,繼續前後兩位判斷

public static boolean stringinverse(int x)

int f = 1;

while (x / f >= 10)

while (x != 0)

x = (x % f) / 10;

f = f / 100;

} return result;

}

解題思路二的第二種實現方式:

首先還是負數直接false;其次要考慮的是,當x個位為0時,例如100,也是直接false;

回文整數存在奇位數和偶位數的情況,即2552、252;當x=2552時,只要判斷25和52的逆序相等就可;當x=252時,只需要判斷2和52%10即可;也就是把整數從中間拆解,兩邊各一半,對於奇位數把右半部分取模運算再逆序和左半部分比較。對於迴圈的結束條件,當然是確定拆解的次數是不是到了這個整數的正中間了,即左半部分要大於右半部分的數值。

public static boolean ispalindrome(int x) 

return x == reversed || x == reversed / 10;

}

判斷乙個整數是否為素數 確定乙個整數是否是2的冪

給定乙個整數,編寫乙個函式來確定它是否是2的冪。範圍 1 2 31 1 測試用例 輸入 16,輸出 true 因為 2 4 16 輸入 18,輸出 false.最明顯的暴力方法就是除以2,然後檢查它是否達到1。var poweroftwo function n 由於給出的範圍在0 2 31 1之間,...

常考資料結構與演算法 判斷乙個鍊錶是否為回文結構

給定乙個鍊錶,請判斷該鍊錶是否為回文結構。1,2,2,1 true雙指標,快指標一次走兩步,慢指標一次走一步,快指標走完,慢指標走到中點。然後將中點開始後面節點逆序,比較完之後再將還原該鍊錶。例如 1 3 5 3 1,慢指標會到達5處,然後右半部分逆序,將5的next指向null,將後面3的next...

演算法與資料結構 判斷乙個數是否是3的乘方

題 不適用迭代或者遞迴,判斷乙個int型別的非負整數是否為3的乘方 解題思路 查表法,因為int型別的非負整數是有限的,將所有整數放入乙個set中。然後直接判斷輸入是否在set中即可 整除法,因為3是素數,首先int型別內3的最大乘方數,如果乙個int型別數是3的乘方,那麼該數必然能夠整除最大乘方 ...