LeetCode算法题(一):关于回文数的三种解法

暑假过于堕落,今天不学习,明天变垃圾,所以有时间就刷刷算法题,我觉得Java比较简单,所以我用Java写的,但是其他语言也和这个差不多吧,基本一致

题目是直接从LeetCode搬运的,在这对LeetCode官方表示感谢

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例1:
输入:121
输出:true
示例2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
解法(一):

这个解法应该是大多数人的第一选择,直接将数字转换为字符串,挨个比较。
**优点:**简单,不用费脑子
**缺点:**太low,没深度,而且占用了更多内存

class Solution {
    public boolean isPalindrome(int x) {
         if(x < 0 || (x % 10 == 0 && x != 0)){
	        return false;
	    }
	    String str = "" + x;
	    int i = str.length() - 1;
	    int j = 0;
	    while (i > j) {
	        if (str.charAt(i) != str.charAt(j))
	            return false;
	        i--;
	        j++;
	    }
	    return true;
    }
}

解法(二):
这个算法是我一觉睡醒想到的,这个高级一点,不用转换为字符串,用更少的内存,运算速度更快
优点:内存使用少,运算速度 快,不用转换为字符串
缺点:存在将数倒置过来后,溢出int最大范围的可能,导致结果异常

public static boolean isPalindrome(int x) {
		if(x < 0 || (x % 10 == 0 && x != 0)){
	        return false;
	    }
	    int y = 0;
	    int z = x;
	    while(x >= 10) {
	    	y = y * 10;
	    	y += x % 10;
	    	x = x / 10;
	    }
	    y =  y*10 + x;
	   if(y == z)
		   return true;
	   else
		   return false;
	}

解法(三):最优解
这个算法是我看了看官方给出的答案后改的,这个相对于第二个没有任何缺点,但是有效防止了溢出的问题,因为它采用的我只转换一半,就比如一个9位的数我只转换后四位或五位,不会出现溢出的情况,用前一半和后一半比较,速度也比较快,我的理解,它大概用的查找算法:二分法的思路吧
优点:没有缺点,是我目前理解的最优算法
缺点:找不出缺点

public static boolean isPalindrome(int x) {
		if(x < 0 || (x % 10 == 0 && x != 0)){
	        return false;
	    }
		int re_x = 0;
		while(x > re_x) {
			re_x = re_x*10 + x%10;
			x = x/10;
		}
		return re_x == x || re_x/10 == x;
    
	}

如有问题,可以在评论区直接评论,感谢网友的厚爱,我只是个在编程路上越走越远的小白

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值