学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题。

官方链接:https://leetcode-cn.com/problemset/all/

一、题意

难度:简单

https://leetcode-cn.com/problems/palindrome-number/

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

示例

输入: 121
输出: true

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

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

二、解题

方法一:双指针

思路:

在不看进阶条件的情况下,大多数人想到的肯定是转换成字符串再两两进行对比判断是否一致

代码:

class Solution {
    public boolean isPalindrome(int x) {
     // 将数值转换成字符串
        String str = "" + x;
  // 指针
        int left = 0, right = str.length() - 1;
  // 遍历字符串
        while(left < right){
         // 如果两位字符不一致则返回 false
            if(str.charAt(left++) != str.charAt(right--)){
                return false;
            }
        }
  // 是回文数值,返回 true
        return true;
    }
}

复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(log(N))

方法二:数学

思路:

进阶的条件是不将整数转为字符串,那么我们能不能将该数值直接翻转过来呢?这里我们需要考虑到 int 类型溢出的问题,整体反转显然不合适。而且题目要求是验证是否为回文数,既然是回文数,肯定是从中间向两边延伸都是两两相同的,那么我们就可以只翻转一半即可。

代码:

class Solution {
    public boolean isPalindrome(int x) {
     // 特殊判断
        if(x < 0 || (x > 0 && x % 10 == 0)){
            return false;
        }
  // 翻转变量
        int reverse = 0;
  // 当 reverse 大于或者等于 x 的时候即达到该数值的一半位数
        while(reverse < x){
         // 数值拼接
            reverse = reverse * 10 + x % 10;
            // 舍弃个位数
            x /= 10;
        }
  // X 长度有奇数和偶数两种情况,如果是偶数则两数相等,如果是奇数则 reverse 得去除个位数再进行比较
        return reverse == x || reverse / 10 == x;
    }
}

复杂度分析:

  • 时间复杂度:O(log(N))
  • 空间复杂度:O(1)

今天的文章到这里就结束了,小伙伴们有什么建议或者意见请联系我改进哦,你们的支持是我最大的动力!!!