02_不修改數組找出重複的數字


/**題目:
* 不修改數組找出重複的數字
* 在一個長度爲n+1的數組裏的全部數字都在1到n的範圍內,因此數組中至少有一個數字是重複的。請找出數組中重複的數字,但不能修改輸入的數組。例如,若是輸入長度爲8的數組{2, 3, 5, 4, 3, 2, 6, 7},那麼對應的輸出是重複的數字2或者3。
*/

/**思路:其實能夠當作我第一篇的另一種方法
*仍是用set集合作對比,將set集合中的每一個數字去原始數據源中一一對比,並用計數器記下出現次數,當計數達到2時就能夠結束循環以節約系統性能
*輸出計數到2的數字就是重複的數字了;
*(注意:須要配合break跳出語句來對輸出結果去重;這題的代碼稍微拓展一下就能夠統計每一個元素出現的次數了;)
*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;
public class Demo {   public static void main ( String[] args ) {            //------------------------------------------前期準備工做-------------------------------------------------------      //輸入數組的長度;      Scanner sc =new Scanner(System.in);      System.out.print("請輸入取值範圍(0~n):"+"\t");      int n = sc.nextInt ( );            //題目要求的數組      ArrayList<Integer> arr =new ArrayList<> (  );      //去重數組      HashSet< Integer > mset = new HashSet<> ( );            Random ran=new Random (  );      //隨機n次,產生n個數,存入數組中      for ( int i = 0; i <n ; i++ ) {         //產生一個0~n-1之間的隨機數,存入數組         int j = ran.nextInt ( n )+1; //由於題目規定取值範圍1~n         arr.add (j);         mset.add ( j );      }      System.out.println("------------------------[ 原始數據 ]------------------------");      System.out.println ("隨機數組值爲:"+arr);      System.out.println ("去重參考值爲:"+mset);      //------------------------------------------前期準備工做-------------------------------------------------------            //------------------------------------------找出重複工做-------------------------------------------------------      /**思路:       * 一、定義一個變量temp,定義一個計數器count       * 二、遍歷數組,賦值temp並做爲比較值,碰見同樣的count++;       * 三、當count>1時,輸出       *       * */         System.out.println ("重複的值有:" );      //第一層遍歷無重複的集合      for ( Integer i : mset ) {         int count =0;         int temp=i;         //在找出每一個數字在原始數據中的個數(由於他本身自己算一個,因此只有計數大於1纔是重複)         for ( Integer j : arr ) {            if(i==j){               count++;                  //若是重複                  if(count>1){                     System.out.print ( j +"\t");                     //必需要寫,否則當重複數字個數大於2時,會將一個數字輸出屢次                     break;//break跳出此次循環(針對的arr,這樣set集合會換下一個值來循環)                  }            }         }      }         }}
相關文章
相關標籤/搜索