幾道回文數案例

2021-09-29 08:04:27 字數 3444 閱讀 5067

說明指正序(從左向右)和倒序(從右向左)讀是一樣的

例如:abcdcba,abccba,正著讀反著讀是一樣的。

題目:給定乙個字串,判斷該字串是否屬於乙個回文數。

方式一:暴力法

原理:把字串反轉過來,乙個乙個字元比較。

說明:該方式不推薦使用,當乙個字串非常長時,把字串反轉需耗時,再乙個乙個字元比較也需耗時,而且此方式比較的時間複雜度是o(n^2),n代表字元的個數。所以**就不貼了。

方式二:(對半法)摺疊法

原理:用第乙個字元和最後乙個字元比較,再比較第二個字元和倒數第二個字元,依次類推,一直比較到中心的位置。

例如

abcdcba,先比較a,比較b,比較c,d不需要比較了,就比較完了。

abccba,先比較a,比較b,比較c,就比較完了。

(對半法)摺疊法原始碼

/**

* 判斷乙個字串是否屬於回文數

*/public static boolean checkstring(string s)

// 轉換成char陣列

char ch = s.tochararray();

int left = 0; // 第乙個字元

int right = ch.length-1; // 最後乙個字元

// 如果是奇數的字串,最中間一位不需要比較

while (left < right) else

} return true;

}

原理:先計算字串的長度是奇數還是偶數,再獲取到中位數字置,以中位數的位置,依次向左右兩個方向進行比較,和摺疊法有點類似。

例如

abcdcba,是奇數,先獲取中位數d的位置,然後依次比較c,b,a字元,向兩端擴充套件。

abccba,是偶數,先獲取左中位數c,再獲取右中位數c,依次比較c,b,a字元,向兩端擴充套件。

備註:摺疊法是從兩端往中間方向比較,中心擴充套件法是從中間往兩端方向比較。

中心擴充套件法原始碼

/**

* 中心擴充套件法

* @param s

* @return

*/public static boolean revertstring(string s)

// 轉換成char陣列

char ch = s.tochararray();

int length = ch.length;

int left = 0; // 獲取左中位數

int right = 0; // 獲取右中位數

// 如果是奇數的字串,最中間一位不需要比較

if ((ch.length & 1) == 1) else

while (left >= 0 && right < length)

left--;

right++;

} return true;

}

題目:給定乙個數字,判斷該數字是否屬於回文數。

分析

場景一:數字是不能通過反轉來比較的,如果是整數,可能會整型溢位,如:2147483647,把該數字反轉之後,會整型溢位,其它數字型別資料都可能存在溢位的情況。

場景二:如果是負數,或者數字最後一位是0,都不會是回文數。

方式一:數字轉字串

原理:把數字轉換成字串,再用字串的方式判斷是否屬於回文數,見上面案例。

方式二:前尾去除法

原理:每一次比較前尾兩個數字,比較完之後就把前尾兩個數字去除,再用剩餘的數進行比較。

例如

1234321/1000000 = 1234321%10,比較完之後,把前後兩個數字去除,剩餘23432。

23432/10000 = 23432%10,比較完之後,把前後兩個數字去除,剩餘343。

343/100 = 343%10,比較完之後,把前後兩個數字去除,剩餘4。

判斷1234321是乙個回文數字。

前尾去除法原始碼

/**

* 判斷乙個數是否屬於回文數

*/public static boolean checknumber(int x)

// 先計算出最大的位數

int div = 1;

while (x / div > 9)

while (x > 9)

// 去除第一位數和最後一位數

x = x % div;

x = x / 10;

// 因為一次性去除了兩位數字,所以除以100

div = div / 100;

} return true;

}

方式三:對半法(摺疊法)例如:int x = 1234321

第一步:每一次都先取最低位,也就是x%10。

第二步:把最低位加在取出數的末尾,revertnum = revertnum * 10 + x % 10。

第三步:再把x/10。

第四步:重複第二步、第三步,當revertnum>x時,跳出迴圈。

第五步:考慮x有奇偶的情況,如果是偶數,x=revertnum,如果是奇數,x = revertnum/10。

對半法(摺疊法)原始碼

/**

* 折半法(摺疊法)

回文數 第N個回文數

判斷回文數還是不難,如果能轉為字串就更簡單了。如果是求第n個回文數呢。12321是乙個回文數,這裡先考慮一半的情況。回文數的個數其實是有規律的。如 1位回文數 9個 2位回文數 9個 3位回文數 90個 4位回文數 90個 5位回文數 900個 6位回文數 900個 我們看到9 90 900,是不是...

判斷回文數

如果乙個數的反向倒置數和它的順向數一樣,那麼這個數稱為回文數。編寫乙個測試程式,提示使用者輸入乙個整數值,然後報告這個數是不是回文數。我先後一共寫了三個函式。方法一 由於題目要求輸入的是整數值,所以按照整數的方法倒置數字,與原數比較即可。public class palindrom public s...

特殊回文數

123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入格式 輸入一行,包含乙個正整數n。輸出格式 按從小到大的順序輸出滿足條件的整數,每個整數佔一行。思路 看到網上的乙個 學習了,但提交到藍橋試題才20分...