前言:由于在公司工作比较繁忙,导致之前刷的算法题忘记了许多,因此最近要大量回顾之前刷过的算法题,旨在有利于自己更好的复习,想跟着学习或复习的小伙伴儿们也可以参考一下
如果有什么需要改进的地方还请大佬斧正
小威在此先感谢诸佬了
个人主页:小威要向诸佬学习呀
个人简介:大家好,我是小威,一个想要与大家共同进步的男人
目前状况:目前大二,在一家满意的公司实习如果大佬在准备面试,找工作,刷算法,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬
牛客部分使用反馈,个人感觉还不错,帮我找到了心仪的公司,希望各位伙伴儿们通过它也能提高不少
以下正文开始
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
思路:本题可以采用双指针的方法,即定义两个指针,左指针指向头部,右指针依次往后移动,右指针遇到非0的数,就和左指针相对应的数交换,最后结果就会变成左指针之前的数不为0,且按原来的顺序排列,后面的数都为0。
代码+详解:
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//两个指针i和j,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; //同时左指针也往右移
}
}
}
}
根据代码,示例一能讲的通,但为什么i要从下标为0开始而不是从1开始呢?假如nums对应的数组是[1,2,0],前两个都是非0元素,这时候就要走if判断,相当于nums[0]和自己换,同时左指针和右指针都会往后移动。
当然本题也有其他解法,就是利用另一个数组,把原来数组中不为0的部分赋值给结果数组,之后按照数组的长度在结果数组后面补0即可。
代码+详解:
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) { //从j开始遍历
nums[i] = 0;
}
}
}