/**题目:
* 不修改数组找出重复的数字
* 在一个长度为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集合会换下一个值来循环) } } } } }}