题目描述

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

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

思路

  给出了长度为n且数组内的数字的范围是0-n,0-n的范围恰好是这个数组的索引的范围。思路是遍历整个数组,把值为j的元素放到索引为j的位置上,如果整个数组没有重复,那么在放置的过程中就不会发生冲突。

{3,0,2,1}
{0,1,2,3}

  如果至少有一个元素发生了至少一次冲突,那么置换完毕后的数组的长度肯定小于原有数组的长度。

{3,0,2,2}
{0,2,3}

实现

  这种需要置换的,肯定把置换的方法写出来

    public static void swap(int[]arr,int i,int j){/*** 把数组arr里位置i j的元素交换位置*/int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

  我的第一版是这样的,看起来好像没啥问题。遍历整个数组,然后把arr[i]位置的元素和arr[arr[i]]位置的元素交换。

   public static boolean isDuplicate(int[] arr){int length = arr.length;for(int i=0; i<=length-1; i++){if(arr[i] == arr[arr[i]])return true;else {swap(arr, i, arr[i]);}}return false;}

  我拿[3,1,0,2]这个数组测试的时候,返回的是true,这显然是不对的。调试之后发现在i=1即循环一次后,数组变成了{3,1,2,0},返回true。返回的条件是arr[1] == arr[arr[1]]。到这里我就看到我这个算法的问题了,我的算法只有在原始数组是完全乱序的前提下才会返回正确的结果,也即我的算法是判断一个数组是否完全乱序。因为{3,1,2,0}中的1处在了正确的位置,所以会导致提前退出。

  错误的原因是我没有考虑到一个数组的arr[i]==i的情况下,也会出现上述的交换冲突。

  public static boolean isDuplicate2(int[] arr){int length = arr.length;for(int i=0; i<=length-1; i++){if(arr[i] == arr[arr[i]] && arr[i] != i)return true;else {swap(arr, i, arr[i]);}}return false;}

转载于:https://www.cnblogs.com/AshOfTime/p/10391657.html

3 数组中的重复数字相关推荐

  1. 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

    题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...

  2. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...

  3. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

    [问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...

  4. np.unique( )--去除数组中的重复数字,并进行排序之后输出

    该函数是去除数组中的重复数字,并进行排序之后输出. 要求是 arr 里面是相同的维数. import numpy as npresult1 = np.unique([1, 1, 2, 2, 2, 3, ...

  5. C/C++面试之算法系列--去除数组中的重复数字

    去除数组中的重复数字 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/ ...

  6. 剑指offer系列-03.数组中的重复数字

    剑指offer系列第03题.数组中的重复数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...

  7. 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II

    重复一次 [抄题]: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. [思维问题]: [ ...

  8. 寻找数组中的重复数字(java,可执行程序)

    package Array;import java.util.ArrayList; import java.util.Arrays;public class ex3_2 {public static ...

  9. 删除排序数组中的重复数字 II

    题目连接 http://www.lintcode.com/zh-cn/problem/remove-duplicates-from-sorted-array-ii/ 题目大意 跟进"删除重复 ...

最新文章

  1. Java基础入门语法和安装
  2. android Studio 配置LUA 开发环境
  3. MSTP多业务传输平台对设备接口的要求有哪些?
  4. 小程序_协作开发(版本控制)
  5. JavaScript栈和队列方法(Array类型)
  6. 使用Python分析英文句子的词性和情感倾向
  7. D:\ProgramData\Anaconda3\envs\test_onnx\python.exe: No module named pip
  8. 为什么单片机定时器的TH和TL都要设置?
  9. Minecraft服务器搭建(官方服务器端)
  10. 【电商网站】将商品加入购物车代码
  11. 对抗生成网络代码Generative Adversarial Networks (GANs),Vanilla GAN,Deeply Convolutional GANs
  12. 嵌入式编程中boot和app的s19简易合并方法(使用mfc编程)
  13. unity GetComponent使用
  14. Linux脚本的制作命令
  15. hdu5445 Food Problem(背包)
  16. MATLAB 2020a 安装许可证错误问题 licensing error:-8523
  17. 拼多多被指洗钱 官方回应:将起诉差评并索赔1000万元
  18. 使用nmap扫描端口
  19. 数字电路48( 逐次比较型模数转换器的工作原理)
  20. r86s编译lede x86 OpenWrt

热门文章

  1. [蓝桥杯][2015年第六届真题]表格计算(递归+记忆化)
  2. Swap Letters CodeForces - 1215C(贪心)
  3. CVPR 2021 | 如何让GAN的训练更加高效优雅
  4. 汇编语言start标号的作用
  5. java服务器内存问题_java内存泄漏5种情况总结
  6. 【算法竞赛学习】数据分析达人赛3:汽车产品聚类分析
  7. python爬取大众点评_浅谈python爬取58同城,大众点评这两个网站
  8. [机器学习] LR与SVM的异同
  9. Socket 编程 windows到Linux代码移植遇到的问题
  10. 5个强大的Java分布式缓存框架