Java有序数组——原地去重——不使用额外空间
Java数组去重
- Java有序数组——原地去重——不使用额外空间
- 1. 题目:
- 2. 示例:
- 3. 思路:
- 4. 源码
- 5. 运行结果:
- 6. 拓展
Java有序数组——原地去重——不使用额外空间
1. 题目:
升序
排列的数组 nums,原地
删除重复出现的元素,返回删除后数组的新长度,元素的相对顺序应该保持一致.
注:不
要使用额外
的空间
,你必须在原地修改输入数组。
2. 示例:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
3. 思路:
什么去重?那直接Set集合,哦,不让用,那~
暴力解题法,题目中已经说了有序数组,那么我们只需要把相邻的前后数进行比较,如果相同就把前边的数给覆盖。
如a = [1,1,2],在比较a[0]==a[1],两个相同那就把[0]给覆盖掉变成a=[1,2,2],此时注意你的最后一个元素就是已经没有用了,所以有效长度为length-1
4. 源码
package com.guo.java;
public class java {public static void main(String[] args) {int num[] = {0,0,1,1,1,2,2,3,3,4};int length = num.length;for (int i = 0; i < length-1; i++) {if (num[i]==num[i+1]){for (int j = i+1; j < length-1; j++) {num[j] = num[j+1];}length--; //记录有效长度i--; //比如第1,2位下标对应的数值相等,那么2后边的数会把前边的给覆盖,此时新第2位是被第3位覆盖了,此时你还是需要比较新的第1,2位元素}}System.out.println("新数据长度:" + length);System.out.print("nums=["+num[0]);for (int i = 1; i < length; i++) {System.out.print("," + num[i]);}System.out.println("]");}
}
5. 运行结果:
新数据长度:5
nums=[0,1,2,3,4]
6. 拓展
这道题让我想到了字符串去空格,文章前后去空格。不使用额外空间也能想到数值交换
比如int a,b; 两个int类型的数值,交换他们的数值不引用第三个变量
//方法1
int a,b;
a=a+b;
b=a-b;
a=a-b;//方法2
int a,b;
a=a*b;
b=a/b;
a=a/b;//方法3
int a,b;
a=a^b;
b=a^b;
a=a^b;
三种方法交换另两个数的值,前两种是同一个类型的,第三种用的是二进制的位运算中的异或。异或的精华就在于相同位上:相同为0不同为1
1111 ^ 0011=1100(异或别名不进位相加
)
a ^ b ^ a = b;
只要某个数出现偶数次,那么异或的结果就是0
0和任意数值异或都是任意数值(就相当于0+x=x,x表示任意数)
C去重排序3种方法: https://blog.csdn.net/qq_45896330/article/details/123596143
Java数组之一维数值数组之数据去重 :https://blog.csdn.net/qq_45896330/article/details/110199684
左神算法学习–异或运算(无进位相加):https://blog.csdn.net/qq_45896330/article/details/123895344
Java有序数组——原地去重——不使用额外空间相关推荐
- 有序数组原地删除重复出现的元素问题(js)
前言:我是老菜鸡了 原题: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在 ...
- java有序数组找中位数_有序数组中找中位数
题目:两个有序数组A和B,大小都是n,寻找这两个数组合并后的中位数.时间复杂度为O(logn). 中位数:如果数组的个数是奇数,那么中位数的值就是有序时处于中间的数:如果数组个数是偶数的,那么就是有序 ...
- java 有序数组 频率_java基础最全面总结_1
一. 面向对象: { 1.面向对象的思想 :基于面向过程的编程思想 特点:符合我们思想的 将复杂的简单化 将我们从执行者变为指挥者 开发:不断创建对象使用对象指挥对象做事情 设计:就是管理和维护对象之 ...
- 对两个有序数组重新去重合并排序js实现
这里主要是要利用两个数组有序这个条件,所以只需两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针,如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳 ...
- [Leetcode][第977题][JAVA][有序数组的平方][排序][双指针]
[问题描述][简单] [解答思路] 1. 排序 平方后排序 没有使用排序的特性 时间复杂度:O(NlogN) 空间复杂度:O(1) class Solution {public int[] sorte ...
- 删除有序数组中的重复项(数组去重)
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...
- Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?
LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...
- 去除有序数组/链表的重复元素--双指针原地修改
去除有序数组的重复元素–双指针原地修改 文章目录 去除有序数组的重复元素--双指针原地修改 一.题目描述 二.分析 三.代码:数组 四.代码:链表 一.题目描述 二.分析 显然,由于数组已经排序,所以 ...
- 合并有序数组java
题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.(不使用额外空间) 初始化 A 和 B 的元素数量分别为 m 和 n. ...
最新文章
- 又一重磅嘉宾来袭 | 国际人工智能联合会理事长杨强助阵2018品友互动人工智能大会
- 关于Simple Joule Theif Curcuit 电路的两个提问
- 彻底搞懂JVM类加载器:基本概念
- 解密个性化资讯推荐技术
- android 获取屏幕的宽高
- 【知识分享】异步调用与多线程的区别
- learnpythonthehardway下载_Python【十一】:阶段小结
- mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?
- arcgis导出shp文件_RegionManager GIS导出shp文件编码说明
- Android8.0 HIDL绑定式和直通式区别
- 64、剑指offer--滑动窗口最大值
- html+css响应式布局
- odbc中不显示oracle,oracle:odbc无法提供初始化
- Maya2020入门:标题栏+菜单栏+状态栏
- easyui-combobox之setText与setValue先后之分
- 【vue技术】vue宠物领养管理系统
- vmware esxi 资源池详解
- 联通光猫上海贝尔阿尔卡特 100A-AA 刷 OpenWRT
- CF 229C Triangles
- html自动生成价格,Excel技巧:用VLOOKUP函数制作产品报价单,自动生成价格!