国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

數(shù)組中重復(fù)的數(shù)字

2019-11-08 01:46:31
字體:
供稿:網(wǎng)友

在一個長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)。 數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個數(shù)字是重復(fù)的。也不知道每個數(shù)字重復(fù)幾次。請找出數(shù)組中任意一個重復(fù)的數(shù)字。 例如,如果輸入長度為7的數(shù)組{2,3,1,0,2,5,3},那么對應(yīng)的輸出是重復(fù)的數(shù)字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++    //    這里要特別注意~返回任意重復(fù)的一個,賦值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,可以對于每個數(shù)在其下標對應(yīng)位置中的數(shù)加上length,如果其中一個位置加了兩次length,則表明其實重復(fù)的。

 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 ;     }}

方法三:將每個位置的數(shù)都回歸到其對應(yīng)的位置,其對應(yīng)位置的數(shù)又移到其對應(yīng)下標的位置,如果碰到要移動的位置上的數(shù)和當前數(shù)是一樣的,那么就判定其是重復(fù)的數(shù)

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 ;            }        }    }}添加筆記
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 商河县| 延津县| 昌宁县| 东莞市| 永靖县| 开平市| 阿拉善右旗| 洛扎县| 富平县| 谢通门县| 漠河县| 金溪县| 兖州市| 铁岭市| 永新县| 高淳县| 明水县| 嘉祥县| 青海省| 旺苍县| 延安市| 永康市| 林周县| 潼关县| 鸡东县| 丰都县| 邳州市| 崇明县| 铜山县| 武川县| 丰台区| 股票| 敦化市| 沈阳市| 云林县| 恩施市| 锡林郭勒盟| 合作市| 民勤县| 广灵县| 垦利县|