题目
https://leetcode-cn.com/problems/move-zeroes/
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
难度:简单
思路
1.开辟新空间,存储所有不为0的元素,然后补0,不满足原数组操作要求
2.记录非0的个数,非0个数作为下标,不停的用当前值替换;再把后面的值全部置0;
3.一个变量记录0的位置,然后和下一个非0元素交换
解法
2.记录非0个数。
//leetcode submit region begin(Prohibit modification and deletion)
class moveZeroes {
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (0 != nums[i]) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
}
for (int i = j; i < nums.length; ++i) {
nums[i] = 0;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
3.记录0位置。
//leetcode submit region begin(Prohibit modification and deletion)
class moveZeroes {
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (0 != nums[i]) {
if (i != j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
// 异或会慢一点,临时变量在寄存器交换,不涉及计算
// nums[i] ^= nums[j];
// nums[j] ^= nums[i];
// nums[i] ^= nums[j];
}
j++;
}
}
}
}
//leetcode submit region end(Prohibit modification and deletion)