9.迴文數

題目:

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121
輸出: true
示例 2:

輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
示例 3:

輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。
進階:

你能不將整數轉爲字符串來解決這個問題嗎?

思路:

首先負數肯定不是迴文數,若輸入爲負數,則直接判斷,剩下非負數將其轉換爲字符串,字符串從串兩頭向中間遍歷並比較兩頭元素是否相等。

代碼:

    public static boolean isPalindrome(int x) {
        if(x<0) {
        	return false;
        }
        String s = x+"";
        for(int i=0;i<=s.length()/2;i++) {
        	if(s.charAt(i)!=s.charAt(s.length()-i-1)) {
        		return false;
        	}
        }
        return true;
    }

優化:

不將數字轉字符串,直接利用除數和取餘的方式獲取數字的頭尾元素。代碼細節還是蠻多的,不細說。舉個例子,輸入整數爲12321,首先12321 / 10000 = 1(最高位)12321 % 10 = 1(最低位),然後比較最高位和最低位。12321 %1000 = 12 ,12 - 1*10 = 2(第二高位,1*10中的1爲最高位求得的),12321 % 100 = 21, (21 - 1)/ 10 =  2(第二低位,所減1位最低位),然後比較第二高位和第二低位,直到比較到最中間的位。

代碼:

    public static boolean isPalindrome1(int x) {
        if(x<0) {
        	return false;
        }
        int len = 0;
        int rest1 = 0,rest2 = 0;
        int sub1=1, sub2 = 10;
        int tempx = x;
        while(tempx>0) {
        	tempx = tempx/10;
        	len++;
        	sub1 = sub1 * 10;
        	if(len == 1) {
        		sub1 = sub1 / 10;
        	}
        }
        for(int i=0;i<=len/2&&sub1>=sub2;i++) {
        	if((x / sub1 - rest1 * 10)!=(x % sub2 - rest2)*10/sub2) {
        		return false;
        	}
        	rest1 = x / sub1;
        	rest2 = x % sub2;
        	sub1 = sub1 / 10;
        	sub2 = sub2 * 10;
        }
        return true;
    }

注:不使用轉字符串的方式還要注意不要導致整數溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章