This blog was born for her
加一
题意:
给定一个vector,数组内元素从后往前依次为一个正整数的个、十、百······位,现在将这个正整数加一,返回加一后的结果
思路:
我们可以模拟 “将digits
这个数组表示的正整数加一” 这个过程,即在数组的最后一个元素,也就是个位上加一,若最后一个元素为9
,就把这一位变成0(进位),继续向前找,如果遇到9
就重复上述操作,直到找到一位非9
的数字,将这个数字加一后直接返回digits
即可
若digits
中全为9
,则将digits[0]
,即最高位变为1
,再加一个0
进入digits
(因为在最高位进位后digits
表示的正整数位数多了一个)
代码:
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
//从后(最后一位)往前遍历数组
for (int i = digits.size() - 1; i >= 0; i--) {
if (digits[i] == 9) digits[i] = 0; //若该为上的数字为9,将他变成0后向下一位进1
else {
digits[i]++; //若该位上数字非9,直接将该位上数字加一后返回digits即可
return digits;
}
}
//特殊情况:digits中元素全为9
digits[0] = 1;
digits.push_back(0);
return digits;
}
};
移动零
题意:
数组中非零元素相对位置不变,将数组中的所有 0 0 0 移到数组末尾
思路:
将非零元素挨个往前挪,将所有非零元素挪完之后,把后面的元素都赋成 0 0 0 即可,如:
nums = [0,1,0,3,12]
//我们定义两个变量: l 和 r, 他们的作用是指向数组中的元素,初始值为0
l=0
[0, 1, 0, 3, 12]
r=0
//我们每次都判断r指向的元素是否为0
//若nums[r]==0, 我们让r++, 跳过这个数
//若nums[r]!=0, 我们将nums[r]赋给nums[l], 然后r++, l++
//直到r大于nums.size()-1
l=0 l=0
[0, 1, 0, 3, 12] → [1, 1, 0, 3, 12]
r=1 r=1
l=1
[1, 1, 0, 3, 12]
r=2
l=1 l=1
[1, 1, 0, 3, 12] → [1, 3, 0, 3, 12]
r=3 r=3
l=2 l=2
[1, 3, 0, 3, 12] → [1, 3, 12, 3, 12]
r=4 r=4
l=3
[1, 3, 12, 3, 12]
r=5
//此时r大于nums.size()-1, nums数组中的所有非零元素全部被挪到了前面
//现在我们只需要把l, 以及l后面的元素全变成0就好了, 即
l=3 l=3
[1, 3, 12, 3, 12] → [1, 3, 12, 0, 0]
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int l = 0, r = 0;
//将非零元素往前挪
while(r < nums.size()) {
if (nums[r]) {
nums[l] = nums[r];
l++;
}
r++;
}
//将l及后面的数全变成0
for (int i = l; i < nums.size(); ++i) {
nums[i] = 0;
}
}
};
两数之和
题意:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
思路:
我们可以在遍历数组的时候看我们想得到的目标值减去当前值得到的数在数组中有没有出现过,如果出现过的话直接返回他们两个的下标就可以了
开一个map用于记录数字对应的数组下标,从前往后遍历整个数组
若target-nums[i]
在nums
数组中出现过(map记录过target-nums[i]
的下标),则直接返回target-nums[i]
的下标与nums[i]
的下标,即:return {mp[target - nums[i]], i};
若target-nums[i]
在nums
数组中没出现过,则用map记录nums[i]
的下标,即mp[nums[i]] = i
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> mp; //mp用于记录数组下标,即mp[x]的值是x在nums数组中的数组下标
for (int i = 0; i < nums.size(); i++) {
//若target-nums[i]在nums数组中出现过则直接返回答案
if (mp.count(target - nums[i])) return {mp[target - nums[i]], i};
//否则记录当前数组下标
else mp[nums[i]] = i;
}
return {};
}
};
更新中