首页 > 其他分享 >『LeetCode』9. 回文数 Palindrome Number

『LeetCode』9. 回文数 Palindrome Number

时间:2023-12-25 20:33:45浏览次数:52  
标签:10 Palindrome 数字 反转 rev Number 121 LeetCode 回文

题目描述

给你一个整数x,如果x是一个回文整数,返回true;否则,返回false
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121是回文,而123不是。

示例 1

输入:x = 121
输出:true

示例 2

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

示例 3

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

提示

  • -231 <= x <= 231 - 1

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

题目链接https://leetcode.cn/problems/palindrome-number/description/

『1』反转一半数字(模拟法)

解题思路

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。
第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。
但是,如果反转后的数字大于int.MAX,我们将遇到整数溢出问题。
按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。
例如,输入1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字1221是回文。
题解来源:回文数 - 力扣官方题解

实现代码

class Solution {
    // Simulation
    // N is the number of digits in the number x  
    // Time Complexity: O(log(N))
    // Space Complexity: O(1)
    public boolean isPalindrome(int x) {
        // 0 是回文数
        if (x == 0) return true;
        // 负数有负号,一定不是回文数
        // 正数若为 10 的整数倍,则其反转后会少一位数,一定不是回文数
        // 目前 x 非零,if 语句中 x < 0 为 false 即 x 为正数才继续判断 x % 10,因此省略 x > 0
        if (x < 0 || x % 10 == 0) return false;
        
        // 用于存储反转后的数
        int rev = 0;
        // 当原始数字小于或等于反转后的数字时,就意味着已反转后半部分数字
        // 若 x 位数为偶数,则反转后 rev 与 x 位数相同
        // 若 x 位数为奇数,则反转后 rev 比 x 多一位数,即 x 中间位置的数
        while (x > rev) {
            // 弹出和推入
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        // 处理偶数位数和奇数位数的情况
        // 若为奇数位数,则 rev / 10 以去除推入 rev 的 x 中间位置的数  
        return x == rev || x == rev / 10;
    }
}

标签:10,Palindrome,数字,反转,rev,Number,121,LeetCode,回文
From: https://www.cnblogs.com/torry2022/p/17926932.html

相关文章

  • oracle中排序分析函数row_number()、rank()、dense_rank() 的区别
    row_number()产生的序号不会重复,即1、2、3...rank()产生的序号会重复,但是会跳号,出现1、2、2、4...的情况dense_rank()产生的序号会重复,不会跳号,会出现1、2、2、3的情况而普通的rownum是一个伪列,与你的orderby是没有关系的SELECTrow_number()over(ORDERBYac.check_number......
  • LeetCode-17 电话号码的字母组合
    LeetCode-17电话号码的字母组合给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce&qu......
  • LeetCode-15 三数之和
    LeetCode-15三数之和给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。**注意:**答案中不可以包含重复的三元组。示例1:输入:nums=[-1......
  • 『LeetCode』8. 字符串转换整数 (atoi) String to Integer (atoi)
    题目描述请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正......
  • [LeetCode Hot 100] LeetCode394. 字符串解码
    题目描述思路思路:碰到数字:压入数字栈,注意多位数的情况碰到字母:直接拼接到res遇到[:将num和res分别压入栈遇到]:开始处理栈顶元素方法一:classSolution{publicStringdecodeString(Strings){intnum=0;StringBuilderres=newStringBuil......
  • 『LeetCode』7. 整数反转 Reverse Integer
    题目描述给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[−231,231−1],就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:输入:x......
  • [LeetCode Hot 100] LeetCode739. 每日温度
    题目描述思路:单调递减栈使用单调栈的模板即可。根据题意可知,该题使用的是单调递减栈。问题抽象为:找出数组中右边第一个比我大的元素。方法一:classSolution{publicint[]dailyTemperatures(int[]temperatures){//用于存放结果int[]res=new......
  • [LeetCode Hot 100] LeetCode42. 接雨水
    题目描述思路一:单调栈柱子的高度递减的时候是装不了水的,当碰到第一个比之前高的柱子才可以装水。此时计算栈顶索引能装的水:宽:i-left-1(这个left为栈顶元素pop之后的peek值)高:min(height[left],height[i])-height[top]该题维护的是一个单调递减栈方法一:对应思路......
  • [LeetCode Hot 100] LeetCode84. 柱状图中最大的矩形
    题目描述思路:枚举+优化(单调栈)先固定矩阵的高。然后向左向右找到第一个比当前元素值小的元素,确定好左右边界。对于元素2来说:向左找到第一个比当前元素值小的元素:1的右边界向右找到第一个比当前元素值小的元素:3的右边界枚举每个元素的上边界,确定往左数最远到达哪个边界......
  • 『LeetCode』6. N 字形变换 Zigzag Conversion
    题目描述将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这......