先看一下题目,算是很简单的题目。
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 <= 1000 <= digits[i] <= 9digits不包含任何前导0。
这道题目本来是打算用vector转stringstream的(当时是没有注意数据范围)
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
// 1. 将 digits 转为字符串
string numStr = "";
for (int d : digits) {
numStr += to_string(d);
}
stringstream ss(numStr);
unsigned long long num;
ss >> num;
// 3. 加 1
num += 1;
// 4. 转回字符串
string resultStr = to_string(num);
// 5. 转为 vector<int>
vector<int> result;
for (char c : resultStr) {
result.push_back(c - '0');
}
return result;
}
};
这个想法就是利用stringstream输入到num,然后加一再转回字符串并且转回数组。
但凡多看一眼数据范围都不会犯这个错
1 <= digits.length <= 100
后面就转变思路改成模拟加法,碰9进1,循环如此,直到没有碰到
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int n = digits.size();
for (int i = n - 1; i >= 0; i--) {
digits[i] += 1;
digits[i] %= 10;
if (digits[i] != 0) { // 无进位
return digits;
}
}
// 所有位都是9,需要添加一位1
digits.insert(digits.begin(), 1);
return digits;
}
};
后面也是成功通过。

未经许可,禁止转载

评论(0)
暂无评论