首页 > 学院 > 开发设计 > 正文

数组中重复的数字

2019-11-08 01:46:31
字体:
来源:转载
供稿:网友

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

方法一:直接用Map处理

import java.util.HashMap;import java.util.Map;  public class Solution {    // Parameters:    //    numbers:     an array of integers    //    length:      the length of array numbers    //    duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;    //                  Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++    //    这里要特别注意~返回任意重复的一个,赋值duplication[0]    // Return value:       true if the input is valid, and there are some duplications in the array number    //                     otherwise false   public boolean duplicate(int numbers[],int length,int [] duplication) {        Mapmap = new HashMap() ;         if(numbers == null || numbers.length == 0){            duplication[0] = -1 ;             return false ;         }        for(int i = 0;i < numbers.length;i++){            if(map.containsKey(numbers[i])){                duplication[0] = numbers[i] ;                 return true ;             }            map.put(numbers[i], 1) ;         }        return false ;     }}

方法二:由于其值为从0到length-1,可以对于每个数在其下标对应位置中的数加上length,如果其中一个位置加了两次length,则表明其实重复的。

 public class Solution {    public boolean duplicate(int numbers[],int length,int [] duplication) {          for(int i = 0;i < length;i++){            int num = numbers[i] ;             if(num >= length){                num -= length ;             }             if(numbers[num] >= length){                duplication[0] = num ;                  return true;             }            numbers[num] += length ;         }        return false ;     }}

方法三:将每个位置的数都回归到其对应的位置,其对应位置的数又移到其对应下标的位置,如果碰到要移动的位置上的数和当前数是一样的,那么就判定其是重复的数

public class Solution {    public boolean duplicate(int numbers[],int length,int [] duplication) {         int pos = 0 ;        int n = length ;        while(pos < n && numbers[pos]==pos)pos++ ;        if(pos==n)return false ;        int num = numbers[pos] ;        numbers[pos] = -1 ;        while(true){            if(pos == n)return false ;            if(num < 0 || num >= length)return false ;            if(numbers[num] == -1){                numbers[num] = num ;                while(pos < n && numbers[pos]==pos)pos++ ;                if(pos == n)return false ;                num = numbers[pos] ;                numbers[pos]=-1 ;            }            if(num == numbers[num]){                duplication[0] = num ;                return true ;            }else{                int tmp = numbers[num] ;                numbers[num] = num ;                num = tmp ;            }        }    }}添加笔记
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表