当前位置: 首页 > news >正文

移除元素remove-element

目录

  • 移除元素remove-element
    • 方法一:双指针
    • 方法二:双指针 —— 当要删除的元素很少时

移除元素remove-element

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。

示例 2:

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

方法一:双指针

package remove_element;

public class Solution {
	
    public int removeElement(int[] nums, int val) {
	    if (nums.length == 0) return 0;
	    int j = 0;
	    for (int i = 0; i < nums.length; i++) {
			if(nums[i]!=val) {
				nums[j]=nums[i];
				j++;
			}
		}
	    return j;
    }
    
	//打印数组
	private static void printArry(int len,int[] nums) {
		System.out.println();
		String ss = "[";
		for (int i = 0; i < len; i++) {
			if(i+1==len) {
				ss+=nums[i];
			}else {
				ss+=nums[i]+",";
			}
		}
		ss+="]";
		System.out.println(ss);
	}
	
    public static void main(String[] args) {
		//int[] nums = {1,1,2};
		//int[] nums = {0,1,2,2,3,0,4,2};
		int[] nums = {0,1,2,2,3,3,2};
		Solution solu = new Solution();
		printArry(nums.length,nums);
		int len = solu.removeElement(nums,2);
		printArry(len,nums);
	}
}

方法二:双指针 —— 当要删除的元素很少时

当我们遇到 nums[i] = val时,我们可以将当前元素最后一个元素进行交换,并释放最后一个元素。这实际上使数组的大小减少了 1。

public int removeElement(int[] nums, int val) {
    int i = 0;
    int n = nums.length;
    while (i < n) {
        if (nums[i] == val) {
            nums[i] = nums[n - 1];
            // reduce array size by one
            n--;
        } else {
            i++;
        }
    }
    return n;
}

相关文章:

  • 删除排序数组中的重复项Remove Duplicates from Sorted Array
  • 字符串转换整数 (string-to-integer-atoi)
  • 最长公共前缀(longest-common-prefix)
  • 罗马数字转整数(roman-to-integer)
  • 删除链表的倒数第N个节点(remove-nth-node-from-end-of-list)
  • 为什么说合数它一定能够被某个素数整除?
  • 实现 strStr()采用kmp算法
  • translate-shell的使用方法
  • ksnapshot使用
  • 报数count-and-say
  • 递归需要遵守的重要规则
  • 组合总和(combination-sum)
  • 组合总和combination-sum
  • 如何查看隐藏的密码(限chrome浏览器)
  • 最大子序和(maximum-subarray)——动态规划和贪心双解法
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Fastjson的基本使用方法大全
  • httpie使用详解
  • input实现文字超出省略号功能
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • ng6--错误信息小结(持续更新)
  • React Native移动开发实战-3-实现页面间的数据传递
  • Tornado学习笔记(1)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 搞机器学习要哪些技能
  • 基于HAProxy的高性能缓存服务器nuster
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 问题之ssh中Host key verification failed的解决
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序开发之路(一)
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​linux启动进程的方式
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #if和#ifdef区别
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (12)Linux 常见的三种进程状态
  • (4.10~4.16)
  • (备忘)Java Map 遍历
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (力扣)循环队列的实现与详解(C语言)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)Linux Shell编程——输入输出重定向
  • (转)创业的注意事项
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net接口调试与案例
  • /etc/sudoer文件配置简析
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20171102]视图v$session中process字段含义
  • [20180129]bash显示path环境变量.txt
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BUUCTF 2018]Online Tool