/**題目:
* 不修改數組找出重複的數字
* 在一個長度爲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集合會換下一個值來循環) } } } } }}