概述
题目描述: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实现)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复