說明:指正序(從左向右)和倒序(從右向左)讀是一樣的。
例如: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分...