小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
解题
1.使用双指针翻转数组.
不能使用额外的数组,那么指针在数组内部进行交换
通过两次翻转,将第一位的数字放到数组尾部.
注意点:进行翻转后,需要将当前指针向前返回一位.
public void moveZeroes(int[] nums) {
int length = nums.length;
// 用于记录0触发的次数,不用将最后的0放入翻转数组中
int count = 0;
for (int i=0;i < nums.length;i++) {
int tempLength = length - count-1;
// 设置循环的边界
if (i == tempLength) {
break;
}
// 当遇到0时,进行翻转,将0放到目前数组的最后,然后排除0的位置,再次进行翻转. 相当于把0从开头放到了最后
if(0 == nums[i]) {
reverse(nums,i,tempLength);
reverse(nums,i,tempLength-1);
count ++;
// 由于0移动到后面之后,剩下的数自动向前移动了一位,并且i即将移动到下一位.
// 需要让i下次还是指在本次的位置,因此要-1
i--;
}
}
}
public void reverse(int[] nums,int begin,int end) {
while (begin <= end) {
int temp = nums[begin];
nums[begin] = nums[end];
nums[end] = temp;
begin ++;
end --;
}
}