【每日刷题】移动零
283. 移动零 - 力扣(LeetCode)
方法一
自己的AC代码,极端条件下(全0)需要遍历两次。第一个循环把所有不为0的数移到数组前端,第二个循环再把后面的数清零。
class Solution {public void moveZeroes(int[] nums) {int pos = 0;int len = nums.length;for(int i = 0; i < len; i++) {if(nums[i] != 0) {nums[pos++] = nums[i];}}while(pos < len) {nums[pos] = 0;pos++;}}
}
方法二
其实就是双指针, pos 对应左指针, i 对应右指针,只需要遍历一次。如果 nums[i] 为0,就只有 i 加一,如果 nums[i] 不为0, i 和 pos 都加一,并且交换位置。
该方法可以保证:①左指针左边均为非零数;②右指针左边直到左指针处均为零。所以每次交换都是将左指针的零与右指针的非零数交换。
class Solution {public void moveZeroes(int[] nums) {int len = nums.length;int pos = 0;for(int i = 0; i < len; i++) {if(nums[i] != 0) {int tmp = nums[i];nums[i] = nums[pos];nums[pos] = tmp;pos++;}}}
}
其它
从“面试经典150”换到了“hot100”,把重合题目标记了一下。后面大概每天周一到周五各做3道题,思路只简单记录,之后的题解都会比较简单,也不包含Python代码了。希望暑假能刷完,暑假结束回学校后顺利实习。