给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
public class Solution {
public void MoveZeroes(int[] nums) {
int max = nums.Length - 1;
int zeropos = 0;
int flag = 0;
while( zeropos < max ) {
// 从左到右找到第一个0,并从这个0后找第一个非0数,并交换
while( zeropos < max && nums[zeropos] != 0 )
zeropos ++;
if( flag < zeropos )
flag = zeropos + 1;
while( flag < max && nums[flag] == 0 )
flag ++;
if( flag <= max ) {
nums[zeropos] = nums[zeropos]^nums[flag];
nums[flag] = nums[zeropos]^nums[flag];
nums[zeropos] = nums[zeropos]^nums[flag];
}
zeropos ++;
}
}
}
public class Solution {
public void MoveZeroes(int[] nums) {
let max = nums.length;
let zeropos = 0;
let flag = 0;
while( flag < max ) {
if( nums[zeropos] == 0 ) {
if( nums[flag] != 0 ) {
nums[zeropos] = nums[zeropos]^nums[flag];
nums[flag] = nums[zeropos]^nums[flag];
nums[zeropos] = nums[zeropos]^nums[flag];
zeropos ++;
}
}
else {
zeropos ++;
}
flag ++;
}
}
}
public class Solution {
public void MoveZeroes(int[] nums) {
int max = nums.Length - 1;
int zeropos = 0;
int flag = 0;
// 找到第一个非0元素,和末尾的0元素互换
while( flag < max + 1 ) {
if( nums[flag] != 0 ) {
if( nums[zeropos] == 0) {
nums[zeropos] = nums[zeropos]^nums[flag];
nums[flag] = nums[zeropos]^nums[flag];
nums[zeropos] = nums[zeropos]^nums[flag];
}
zeropos ++;
}
flag ++;
}
}
}