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);
//------------------------------------------前期准备工作-------------------------------------------------------

//------------------------------------------找出重复工作-------------------------------------------------------
/**思路:
* 1、定义一个变量temp,定义一个计数器count
* 2、遍历数组,赋值temp并作为比较值,遇见一样的count++;
* 3、当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集合会换下一个值来循环)
}
}
}
}

}
}
posted on 2019-07-26 15:23  筱小逍 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/eiyuan/p/11250594.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值