今天做了一道算法题,刚开始没有思路,直到看到一个点赞超多的评论,看了一遍,逻辑很简单,第一次没看懂,然后去仔细推了一下,结果惊艳到我了!!
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析
这个题目是放在双指针模块需要做的,双指针?那我把两个指针放在哪呢?前前,后后,前后?没有思路,不知道用双指针怎么搞。可能是我思考有点少。之后才明白过来:只是把非零的数往前移动,而不是数字交换。
代码
class Solution {
public void moveZeroes(int[] nums) {
int i = 0,j = 0;
for(i = 0 ; i < nums.length; i++){
//i指针去寻找非零的数
if(nums[i] != 0) {
//j指针从数组0位置开始,记录非零数字
//如果i找到非零的数字,那么就赋值给j指针处。保证相对位置
nums[j++] = nums[i];
}
}
while(j < nums.length) {
//把所有非零数排序好后,然后把后面的数字全部变成0即可
nums[j++] = 0;
}
}
}
//个人感觉这个j++用的非常巧妙!!!
总结
这个题自己思考少了,刚开始受到双指针以及题目说明的影响,在一个数组上操作。没想到能把数组看做两个数组来用。看懂这个逻辑后,真的是很简单,可是自己当时就是没想起来。还是太菜,加油加油。