我是靠谱客的博主 鲜艳手套,最近开发中收集的这篇文章主要介绍LeetCode_27.移除元素_283. 移动零(Java实现),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述:27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums =[2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0,4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路描述:

这题只要思想够好,题就变得超简单。
本题依旧采取双(快慢)指针的思想,若快指针处的值不等于指定值,则将其复制至慢指针处,慢指针再+1;

public static  int removeElement(int[] nums, int val) {
		//慢指针
		int len=0;
		//遍历数组
	    for(int i=0;i<nums.length;i++){
	        //判断当前元素是否与指定数字相同    
	    	if(nums[i]!=val){
	    		//若不相同,将它复制至慢指针所在的元素处
	    		nums[len++]=nums[i];
	        }
	    }
	    //由于慢指针所指元素更新后,自增过,所以返回时不需要+1
	    return len;
	}

在这里插入图片描述

题目描述:283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

思路描述:

思路1:

依旧采用快慢指针。与上一题大差不差。遍历数组,若快指针处的元素不为0,将其复制至慢指针处,遍历完成之后,将慢指针之后元素变为0即可。

class Solution {
    public void moveZeroes(int[] nums) {
        int len=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                nums[len++]=nums[i];
            }
        }
        for(int k=len;k<nums.length;k++){
            nums[k]=0;
        }
    }
}

在这里插入图片描述

思路2(官方题解):

还是使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

注意到以下性质:
左指针左边均为非零数;
右指针左边直到左指针处均为零。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }

    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

与之相似的还有一个题,同样用了快慢指针,里面还有思路图解哟,不清楚可以去看看。
小编这就附上链接:Leetcode_26. 删除有序数组中的重复项(java实现)

最后

以上就是鲜艳手套为你收集整理的LeetCode_27.移除元素_283. 移动零(Java实现)的全部内容,希望文章能够帮你解决LeetCode_27.移除元素_283. 移动零(Java实现)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部