Day 6 刷题
我的解题思路:利用双指针,一个指针不断向前移动,表征是否交换完成,另一个指针负责当次交换的位置。
class Solution {
public void moveZeroes(int[] nums) {
// 当指针p1指向的元素为0时,将其挪到后面
OUT:
for(int p1 = 0; p1<nums.length; p1++){
int p2 = p1;
if(nums[p1] == 0){
// 找到最前面不为0的值
while(nums[p2]==0){
p2++;
if(p2 >= nums.length){
break OUT;
}
}
nums[p1] = nums[p2];
nums[p2] = 0;
p2--;
}
}
}
}
王尼玛的巧妙解题思路:
用 0 当做这个中间点,把不等于 0的放到中间点的左边,等于 0 的放到其右边。
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//两个指针i和j
int j = 0;
for(int i=0;i<nums.length;i++) {
//当前元素!=0,就把其交换到左边,等于0的交换到右边
if(nums[i]!=0) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j++] = tmp;
}
}
}
}
巧妙在利用新索引j来重新更新有元素的值!nums[j++] = tmp;