剑指offer系列24---数组中重复的数字

* 【24】
* 【题目】在一个长度为n的数组里的所有数字都在0到n-1的范围内。
* 数组中某些数字是重复的,但不知道有几个数字是重复的。
* 也不知道每个数字重复几次。
* 请找出数组中任意一个重复的数字。
* 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。

书上方法:

 1 package com.exe6.offer;
 2 /**
 3  * 【24】
 4  * 【题目】在一个长度为n的数组里的所有数字都在0到n-1的范围内。
 5  *  数组中某些数字是重复的,但不知道有几个数字是重复的。
 6  *  也不知道每个数字重复几次。
 7  * 请找出数组中任意一个重复的数字。
 8  * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
 9  * @author WGS
10  *
11  */
12 public class DuplicationNums {
13
14     @SuppressWarnings("unused")
15     public  boolean DuplicationNums(int[] nums){
16         if(nums==null ||nums.length <=0) return false;
17         int len=nums.length;
18         for(int i=0;i<len;i++){
19             if(nums[i]>=len){
20                 System.out.println("输入的数不符合要求!");
21                 return false;
22             }
23         }
24
25         for(int i=0;i<len;i++){
26             while(nums[i]!=i){
27                 if(nums[i]==nums[nums[i]]){
28
29                     return true;
30                 }else{
31                     int temp=nums[i];//2
32                     nums[i]=nums[nums[i]];//1
33                     nums[temp]=temp;
34                 }
35             }
36         }
37         return false;
38     }
39     public static void main(String[] args) {
40         int numbers[]=new int[]{2,3,1,0,2,5,3};
41         DuplicationNums d=new DuplicationNums();
42         boolean b=d.DuplicationNums(numbers);
43         System.out.println(b);
44     }
45
46 }

博主代码,可以显示指定数字重复的次数:

 1 package com.exe6.offer;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 /**
 7  * 【24】
 8  * 【题目】在一个长度为n的数组里的所有数字都在0到n-1的范围内。
 9  *  数组中某些数字是重复的,但不知道有几个数字是重复的。
10  *  也不知道每个数字重复几次。
11  * 请找出数组中任意一个重复的数字。
12  * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
13  * @author WGS
14  *
15  */
16 public class DuplicationNums2 {
17
18
19     public  boolean DuplicationNums2(int[] nums,int [] duplication){
20         if(nums==null ||nums.length <=1) return false;
21         int len=nums.length;
22
23
24         for(int i=0;i<len;i++){
25             if(nums[i]>=len){
26                 System.out.println("输入的数不符合要求!");
27                 return false;
28             }
29         }
30         Map<Integer,Integer> counter=new HashMap<>();
31         for(int i=0;i<len;i++){
32             while(nums[i]!=i){
33                 if(counter.containsKey(nums[i])){
34                     duplication[0]=nums[i];
35                     return true;
36                 }else{
37                     counter.put(nums[i], new Integer(1));
38                 }
39             }
40         }
41         return false;
42     }
43
44     public static void main(String[] args) {
45         int numbers[]=new int[]{2,3,1,0,2,5,3};
46         DuplicationNums2 d=new DuplicationNums2();
47         boolean b=d.DuplicationNums2(numbers,new int[1]);
48         System.out.println(b);
49     }
50
51 }
时间: 2024-10-06 21:44:38

剑指offer系列24---数组中重复的数字的相关文章

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不

【剑指Offer】03. 数组中重复的数字

题目链接 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 解法一:最简单的,排序后找重复的 class Solution { public int findRepeatNumber(int[] nums) {

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

【剑指offer】09-数组中重复的数字

题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 思路: 1.因为所有数字都在0-n-1范围内,将所有数排好序,若前一个数等于后一个数,就返回true class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回T

剑指Offer之旋转数组中的最小数字(题8)

1 /****************************************   2     > File Name:test.c   3     > Author:xiaoxiaohui   4     > mail:[email protected]   5     > Created Time:2016年05月23日 星期一 20时07分13秒   6 ****************************************/   7    8    9 

【剑指offer】旋转数组中的最小值

题目总结: 1.若没有进行旋转,或者说旋转后的效果跟没有旋转是一样的,那么index1指示的值小于index2指示的值,返回index1的值. 2.若是一般性的旋转,那么最小的值旋转后肯定在中间,那么我们就可以从两边向中间夹逼. 3.夹逼的过程中,若 [ index1, middle ] 是有序的,说明这部分子区间没被破坏,旋转所移动的元素都在middle 的后面,那么最小值可定也在后面的部分,令 index1 = middle,继续向后夹逼:同理,若 [ middle ,index2 ] 是有

剑指offer—二维数组中找数

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 基本思想: 首先选取数组中右上角的数字.如果=要找的数字,结束.如果大于要找的数字,剔除这个数字所在的列:如果小于要找的数字,剔除这个数字所在的行. #include <iostream> using namespace std; void find(int a[][4],int rows,int columns,int

剑指offer 面试29—数组中出现次数超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 解法一: 先将数组排序,然后出现次数超过一半的数字就是a[n/2+1],时间复杂度O(nlgn). 解法二:O(n) 基本思想: 消除原理:在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数.当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1.如果下一个数字

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in