20210402力扣第九题:回文数(JAVA)

本文介绍了LeetCode的第9题——回文数问题。通过两种思路解析解决方案,包括使用StringBuilder对比和双指针法。重点讨论了字符串比较的注意事项和时间、空间复杂度的优化。同时,分享了官方解题思路,强调理解和学习他人思想的重要性。
摘要由CSDN通过智能技术生成

1.题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

	输入:x = 121
	输出:true
	
	输入:x = -121
	输出:false
	解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

(来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number)

2.想法

2.1 :起初想法是将int x转换成字符串,在转换为 StringBuilder 使用reverse方法 进行对比,即可返回正确与否。
2.2:方法2.1实现后发现内存和时间消耗的很多,这题比较简单,想用一个start 和end 进行前后项的对比,当遍历完所有的 字符都相等时,返回true,否则为false

3.实现

2.1的实现

class Solution {
    public boolean isPalindrome(int x) 
    {
    		//判断是否超出边界
    	 if(x>Integer.MAX_VALUE||x<Integer.MIN_VALUE){return false;}
        String strX = String.valueOf(x); //转化为字符串 
        
        StringBuilder sb = new StringBuilder(strX);
        String sb2str = sb.reverse().toString();//翻转一下
        
        if(sb2str.equals(strX)){
            return true;
            }
            
        else {return false;}
    }
 }

知识点:int 转换为 String String.valueOf(int x)

字符串的比较 使用的事equals 但不是‘==’
原因:基本字符串比较 == 符号比较的是值,引用变量比较的是地址
两个字符串的比较 必须是‘equals()’;
例子;equals和==的区别是什么

用时、内存情况:在这里插入图片描述

2.2的实现

class Solution {
    public boolean isPalindrome(int x) {
       int start = 0;
       String strX = String.valueOf(x);
       int length = strX.length();
       int end =  length-1;
       while(end>=start){
           if(strX.charAt(end)==strX.charAt(start)){
               start++;
               end--;
           }
           else break;
       }
       if(end<start) return true;
       else return false;
    }
}

这里需要注意的是 我在写的时候 那个while里面没有写等号,就是x长度(这样说不合适,理解就好)是偶数时没问题, 但是奇数时就会存在等于,这个奇偶数需要考虑一下哦。

用时、内存情况:
在这里插入图片描述

4.别人的解法

自己的方法虽然能理解 ,但是效率不是很高,看一下别人是咋做的 。
官方的思路是:
先排除掉特殊的:负数、末尾是0的但数不等于0,这些是false;
其他数字可以 取10的模,得到 倒数第一位,再将倒数第一位数字移除(直接除以10即可),再取10的模,得到 倒数第2位,将得到倒数的数字 第一个数*10+第二个数字,持续反转即可。当原始数字小于等于 翻转数字。就结束了。
叙述官方的说法还是有点一知半解 ,尝试着写写看。

class Solution {
    public boolean isPalindrome(int x) {
    	//特殊情况的
    	if(x<0||(x%10==0&&x!=0))
    	{
    		return false;
    	}
       
       int revertNum = 0;//反转后的
       while(x>revertNum )//循环条件
    	{
    		revertNum =revertNum*10 +  x%10;
    		x=x/10;
    	}
    	//是偶数的话直接返回,是奇数的话看reverNum/10 和x是否相等
    	//自己的想法是用个if判断一下,官方是直接返回的,那我就直接这样写了
    	return reverNum/10==x||reverNum==x;
    	 
    }
}


5.小结

这道题比较简单 ,那么看的就是 使用的时间和空间复杂度的问题,虽然能解出来,我得复杂度比较高。可以看看别人题解的答案扩宽自己的思路,在 写官方给的思路时,我也看了几眼官方怎么写的,比如revertNum =revertNum*10 + x%10;和最后return,看了官方的程序,希望再读其他解题思路的时候,先要读懂别人的思想,再写,别着急。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值