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集合会换下一个值来循环)                  }            }         }      }         }}
相关文章
相关标签/搜索