Leetcode 145 回文数 | 加一

1 题目

9. 回文数

给你一个整数 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

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

2 代码实现

c++

cpp 复制代码
class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0 ){
            return false ;
        }

        std::string s = std::to_string(x);

        int left = 0 ;
        int right = s.size() - 1 ;

        while (left < right ){
            if (s[left] == s[right]){
                left++;
                right--;
            }else{
                return false;
            }
        } 
        return true;
    }
};

js

javascript 复制代码
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  if (x < 0 ){
    return false ;
  }  

  let s = x.toString();
  let left = 0 ;
  let right = s.length - 1 ;

  while (left < right ){
    if (s[left] == s[right]){
        left ++ ;
        right -- ;
    }else{
        return false ;
    }
  }
  return true;
};

思考

首先要进行符号的判断,负数肯定不是回文数。

为什么不转成字符串就好了啊,双指针。

左右指针一直到相遇对应的值都是相同的。

就直接这样双指针就好了。

3 题目

66. 加一

给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0

将大整数加 1,并返回结果的数字数组。

示例 1:

复制代码
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
加 1 后得到 123 + 1 = 124。
因此,结果应该是 [1,2,4]。

示例 2:

复制代码
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
加 1 后得到 4321 + 1 = 4322。
因此,结果应该是 [4,3,2,2]。

示例 3:

复制代码
输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9
  • digits 不包含任何前导 0

4 代码实现

c++

cpp 复制代码
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for (int i = digits.size() - 1 ; i>= 0 ; i--){
            digits[i] += 1 ;

            if (digits[i] < 10 ){
                return digits ;
            }

            digits[i] = 0 ;
        }
        digits.insert(digits.begin() , 1 );
        return digits ;
    }
};

js

javascript 复制代码
/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    for (let i = digits.length - 1 ; i >= 0 ; i--){
        digits[i] += 1 ;

        if (digits[i] < 10){
            return digits;
        }

        digits[i] = 0 ;
    } 
    digits = [1,...digits];
    return digits;
};

思考

真的有必要先转成数字吗?还是怎么搞?这就是数学问题吗。。。我不知道啊。。

题解

cpp 复制代码
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        // 从最后一位开始倒序遍历
        for (int i = digits.size() - 1; i >= 0; --i) {
            digits[i] += 1;  // 当前位加1
            
            // 没有进位,直接返回结果
            if (digits[i] < 10) {
                return digits;
            }
            
            // 有进位,当前位置0,继续遍历前一位
            digits[i] = 0;
        }
        
        // 所有位都是9,遍历完仍有进位,头部插入1
        digits.insert(digits.begin(), 1);
        return digits;
    }
};

代码核心解析

  1. 遍历方式 :从数组最后一位(最低位)开始,模拟手工加法
  2. 进位处理
    • 加 1 后 < 10:无进位,直接返回数组,结束计算
    • 加 1 后 = 10:当前位置 0,继续向前处理进位
  3. 全 9 特殊情况 (如 [9,9]):遍历结束后数组全为 0,在数组开头插入 1 ,得到 [1,0,0]

关键知识点

  • vector<int>& digits:引用传参,原地修改数组,节省空间
  • digits.insert(digits.begin(), 1):在数组头部插入元素 1,对应全 9 进位的场景
  • 时间复杂度:O(n)(最多遍历一次数组)
  • 空间复杂度:O(1)(除结果外无额外空间开销)

测试用例验证

bash 复制代码
输入:[1,2,3]   输出:[1,2,4]
输入:[4,3,2,1] 输出:[4,3,2,2]
输入:[9]       输出:[1,0]
输入:[9,9,9]   输出:[1,0,0,0]

我个人感觉没啥问题,就是数学,纯模拟进位,就只是思路 -> 代码的区别。

5 小结

没啥问题,打个卡,这一块就是数学的问题,接下来算法的大头还是dp,图,算法思想涉及到的这些要花时间啃,别的比较不重要的lc150不用全部做完。

相关推荐
HLC++2 小时前
数据结构--树
c语言·开发语言·数据结构
2501_945424802 小时前
C++构建缓存加速
开发语言·c++·算法
2401_851272992 小时前
多平台UI框架C++开发
开发语言·c++·算法
楼田莉子2 小时前
C++数据结构:基数树
开发语言·数据结构·c++·学习
m0_518019482 小时前
C++中的命令模式实战
开发语言·c++·算法
Tisfy2 小时前
LeetCode 2906.构造乘积矩阵:前后缀分解
算法·leetcode·前缀和·矩阵·题解·前后缀分解
weixin_649555672 小时前
C语言程序结构第四版(何钦铭、颜晖)第十章函数与程序结构之递归实现顺序输出整数
c语言·数据结构·算法
想七想八不如114082 小时前
复试简历复盘--CV论文
算法
cm6543202 小时前
C++中的空对象模式
开发语言·c++·算法