刷题知识回顾《七》移动零

前言:由于在公司工作比较繁忙,导致之前刷的算法题忘记了许多,因此最近要大量回顾之前刷过的算法题,旨在有利于自己更好的复习,想跟着学习或复习的小伙伴儿们也可以参考一下
如果有什么需要改进的地方还请大佬斧正
小威在此先感谢诸佬了
在这里插入图片描述

个人主页:小威要向诸佬学习呀
个人简介:大家好,我是小威,一个想要与大家共同进步的男人
目前状况:目前大二,在一家满意的公司实习

如果大佬在准备面试,找工作,刷算法,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
欢迎大家:这里是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;
		}
	}
}	

在这里插入图片描述

你可能感兴趣的:(算法题复刷详解,算法,数据结构,排序算法)