1 题目
给你一个整数 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 题目
给定一个表示 大整数 的整数数组 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 <= 1000 <= digits[i] <= 9digits不包含任何前导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 后
< 10:无进位,直接返回数组,结束计算 - 加 1 后
= 10:当前位置0,继续向前处理进位
- 加 1 后
- 全 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不用全部做完。