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有序数组——原地去重——不使用额外空间相关推荐

  1. 有序数组原地删除重复出现的元素问题(js)

    前言:我是老菜鸡了 原题: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在 ...

  2. java有序数组找中位数_有序数组中找中位数

    题目:两个有序数组A和B,大小都是n,寻找这两个数组合并后的中位数.时间复杂度为O(logn). 中位数:如果数组的个数是奇数,那么中位数的值就是有序时处于中间的数:如果数组个数是偶数的,那么就是有序 ...

  3. java 有序数组 频率_java基础最全面总结_1

    一. 面向对象: { 1.面向对象的思想 :基于面向过程的编程思想 特点:符合我们思想的 将复杂的简单化 将我们从执行者变为指挥者 开发:不断创建对象使用对象指挥对象做事情 设计:就是管理和维护对象之 ...

  4. 对两个有序数组重新去重合并排序js实现

    这里主要是要利用两个数组有序这个条件,所以只需两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针,如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳 ...

  5. [Leetcode][第977题][JAVA][有序数组的平方][排序][双指针]

    [问题描述][简单] [解答思路] 1. 排序 平方后排序 没有使用排序的特性 时间复杂度:O(NlogN) 空间复杂度:O(1) class Solution {public int[] sorte ...

  6. 删除有序数组中的重复项(数组去重)

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...

  7. Leetcode每日必刷题库第80题,如何在不使用外部空间的情况下对有序数组去重?

    LeetCode的第80题,有序数组去重II(Remove Duplicates from Sorted Array II). 这题的官方难度是Medium,通过率是43.3%,点赞1104,反对69 ...

  8. 去除有序数组/链表的重复元素--双指针原地修改

    去除有序数组的重复元素–双指针原地修改 文章目录 去除有序数组的重复元素--双指针原地修改 一.题目描述 二.分析 三.代码:数组 四.代码:链表 一.题目描述 二.分析 显然,由于数组已经排序,所以 ...

  9. 合并有序数组java

    题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.(不使用额外空间) 初始化 A 和 B 的元素数量分别为 m 和 n. ...

最新文章

  1. 又一重磅嘉宾来袭 | 国际人工智能联合会理事长杨强助阵2018品友互动人工智能大会
  2. 关于Simple Joule Theif Curcuit 电路的两个提问
  3. 彻底搞懂JVM类加载器:基本概念
  4. 解密个性化资讯推荐技术
  5. android 获取屏幕的宽高
  6. 【知识分享】异步调用与多线程的区别
  7. learnpythonthehardway下载_Python【十一】:阶段小结
  8. mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?
  9. arcgis导出shp文件_RegionManager GIS导出shp文件编码说明
  10. Android8.0 HIDL绑定式和直通式区别
  11. 64、剑指offer--滑动窗口最大值
  12. html+css响应式布局
  13. odbc中不显示oracle,oracle:odbc无法提供初始化
  14. Maya2020入门:标题栏+菜单栏+状态栏
  15. easyui-combobox之setText与setValue先后之分
  16. 【vue技术】vue宠物领养管理系统
  17. vmware esxi 资源池详解
  18. 联通光猫上海贝尔阿尔卡特 100A-AA 刷 OpenWRT
  19. CF 229C Triangles
  20. html自动生成价格,Excel技巧:用VLOOKUP函数制作产品报价单,自动生成价格!

热门文章

  1. 三圣花乡享地道农家乐
  2. 数据结构与算法-平衡二叉搜索树
  3. 云计算入门教程普通用户
  4. 使用DS12C887时钟芯片设计高精度时钟(单片机)
  5. 每天自学3~4小时java,一年后能到什么程度
  6. centos7加载磁盘
  7. 一个基于 Dubbo 的微服务改造实践
  8. vivo手机如何投屏到电脑
  9. 联想拯救者笔记本U盘重装win10系统教学
  10. 两万字的Redis笔记!