数组中重复的数字、二维数组中的查找、替换空格--Java知识点解析

1、数组中重复的数字

题目描述

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

解题思路

1)任意一个重复的数字,所以当查找到第一个重复的时候就可以return

2)如果要求时间复杂度O(N),空间复杂度O(1)。则不能使用排序算法。如果没有要求,可以先进行排序,扫描排序之后的数组即可。

3)解决思路一:采用将值为i的元素调整到第i个位置,如果发现位置上面的元素已经有对应数值了,则发现有重复。先进行交换,将所有数字放入对应的位置,交换前面加上一个判断,如果你发现对应位置的数字是对的,然后你又发现一个这样的数字,那这个数字就是重复的一个数字。如果发现多个,那将重复的数字放在数组中进行保存。

     解决思路二:哈希表。从头到尾扫描数组,每扫描到一个数字,判断该数字是否在哈希表中,如果该哈希表还没有这个数字,那么加入哈希表,如果已经存在,则返回该数字;时间复杂度:O(n),空间复杂度:O(n)

     解决思路三:排序,再遍历

交换数字,按位置比较。

  1. public class repeatNum3 {
  2.     /**
  3.      * @param ycy
  4.      */
  5.     public static void main(String[] args) {
  6.         // TODO Auto-generated method stub
  7.         int[] num= {2,3,1,0,2,5};
  8.         int repeat = 0;
  9.         int j = 0;
  10.         
  11.         if(num == null || num.length<=0){
  12.             System.out.println("不存在重复的数据");
  13.         }
  14.         System.out.println("数据长度"+num.length);
  15.         for(int i=0;i<num.length;i++){
  16.             while(num[i] != i){
  17.                 if(num[i] == num[num[i]]){
  18.                     repeat = num[i];
  19.                     System.out.println("存在重复的数据"+repeat);
  20.                     return;
  21.                 }
  22.                     swap(num,i,num[i]);
  23.             }
  24.         }
  25.         return;
  26.     }
  27.     public static void swap(int[] num,int i,int j){
  28.         int t = num[i];
  29.         num[i] = num[j];
  30.         num[j] = t;
  31.     }
  32. }

各种排序算法比较

各种常用排序算法

类别

排序方法

时间复杂度

空间复杂度

稳定性

复杂性

特点

最好

平均

最坏

辅助存储

 

简单

 

插入

排序

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱ycy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值