饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《画解数据结构》
闭关刷 LeetCode,剑指大厂Offer! 《LeetCode 刷题指引》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给定一个数组 n u m s nums nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
样例输入: n u m s = [ 0 , − 1 , 0 , 3 , 9 ] nums = [0,-1,0,3,9] nums=[0,−1,0,3,9]
样例输出: [ − 1 , 3 , 9 , 0 , 0 ] [-1,3,9,0,0] [−1,3,9,0,0]
class Solution {
public:
void moveZeroes(vector<int>& nums) {
}
};
LeetCode 283. 移动零
1)首先,我们定义两个指针 i i i 和 j j j,初始情况下 i = 0 i = 0 i=0, j = 1 j = 1 j=1。
2)当 j < n j \lt n j<n 时, 有四种情况需要考虑了:
a)nums[i]==0, nums[j]==0
,这时候, i i i 不能动, j j j 自增,回到 2);
b)nums[i]==0, nums[j]<>0
,这两个元素继续交换,并且 i i i 自增,自增完毕如果和 j j j 相等,则 j j j 自增,回到 2);
c)nums[i]<>0, nums[j]==0
, i i i 自增,自增完毕如果和 j j j 相等,则 j j j 自增,回到 2);
d)nums[i]<>0, nums[j]<>0
, i i i 和 j j j 同时自增,回到 2);
class Solution {
public:
void moveZeroes(vector<int>& nums) {
if(nums.size() <= 1) {
return ; // (1)
}
int i = 0, j = 1;
while(j < nums.size()) {
if(!nums[i] && !nums[j]) { // (2)
++j;
}else if(!nums[i] && nums[j]) { // (3)
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
if(++i == j) ++j;
}else if(nums[i] && nums[j]) { // (4)
++i, ++j;
}else if(nums[i] && !nums[j]) { // (5)
if(++i == j) ++j;
}
}
}
};
nums[i]==0, nums[j]==0
的情况,是否等于零可以用 !
来实现;nums[i]==0, nums[j]<>0
的情况;nums[i]<>0, nums[j]<>0
的情况;nums[i]<>0, nums[j]==0
的情况;可以用
if(x)
来判断表达式x
是否为真;用if(!x)
来判断表达式x
是否为假;