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;
    }

注:不使用转字符串的方式还要注意不要导致整数溢出。

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