PTA Java版 有重复的数据

1 篇文章 0 订阅

有重复的数据(java)

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

输入格式:
你的程序首先会读到一个正整数n,1<=n<=100000。然后是n个整数。

输出格式:
如果这些整数中存在重复的,就输出:
YES
否则,就输出:
NO

题目给的输入样例:

5
1 2 3 1 4

输出样例:

YES

另外提供几组输入用例:

1
2
2
1 1 
2 
1 2
5
1 2 3 1 4
4
3 2 1 1
  • 普通二重循环暴力查询肯定要超时。
  • 如果有人使用的二分查询(因为暴力查询时间慢,所以我最开始想的是二分),记得要排序(最开始我没排序,还以为自己做的还挺对,其实逻辑就有问题)。
  • 这题有几组测试用例在用Arrays.binarySearch的时候就算你数组没被sort结果也显示为正确(我做的时候search前没sort数组都得了大半的分,但是由于结果肯定是错的,再怎么改上传结果都不能全对),但是自己测试的话会发现像我这里给的第五组这样的数据是能明显说明代码逻辑有问题的。由于没有排序省了大量的时间,这样没sort数组的代码上传结果倒是没有超时
  • 二分查询必须建立在排序的基础上,不排序结果会莫名的怪。(具体想知道咋回事的找度娘)。

  • 简便方法,用HashSet的默认去重,用size()和输入的数据个数相比,不等就输出YES,反之输出NO,但还是由于Scanner,结果会超时。

  • 后来脑子清醒了发现,输入就不一个一个scanner.nextInt()输入,直接读一行,用空格分隔输入数据,再用Integer.parseInt()转成数字放入HashSet中,这样做的结果快了很多,结果也正确了。

  • 这个题的话,我查csdn那些大佬的代码时,看到说Scanner的输入太耗时了,他们举出了用“输入挂”的方法,具体用的输入缓冲流,具体代码我没敲过,这里附两个网址。

    顾道长生 这题的解法(用“输入挂”代替了Scanner)

    博客园 懒人部落 对Scanner和“输入挂”效率的测试

这里我就不给暴力查询的代码了

下面先给两个二分查询的代码,最后给出我上传正确的代码(没用“输入挂”,输入挂的话我暂时还不会)

//这是PTA上传的错误版的代码 但是我觉得逻辑没啥问题 具体是后3、4测试点超时  大量的数据使得sort耗时
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int len=scanner.nextInt();
		int[] arr = new int[len];
		arr[0] = scanner.nextInt();
		int temp;
		for (int i=1; i<len; i++) {
			arr[i] = scanner.nextInt();
			
			temp=arr[i];
			Arrays.sort(arr, 0, i);
			int j=Arrays.binarySearch(arr, 0, i, temp);
			if (j>=0 && j<=i-1) {
				System.out.print("YES");
				return ;
			}
		}
		System.out.print("NO");
	}
}
//这个代码我觉得逻辑是有问题的(没排序)  但是上传1、4测试点还过了
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int len=scanner.nextInt();
		scanner.nextLine();
		int[] arr = new int[len];
		arr[0] = scanner.nextInt();
		for (int i=1; i<len; i++) {
			arr[i] = scanner.nextInt();
			
			int j=Arrays.binarySearch(arr, 0, i-1, arr[i]);
			if (j>=0 && j<=i-1) {
				System.out.print("YES");
				return ;
			}
		}
		System.out.print("NO");
	}
}
//正确代码
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int len=scanner.nextInt();
		scanner.nextLine();
		String str = scanner.nextLine();
		String[] strs = str.split(" ");
		Set<Integer> set = new HashSet<Integer>();
		for (int i=0; i<len; i++) {
			set.add(Integer.parseInt(strs[i]));
		}
		if (set.size() == len) {
			System.out.println("NO");
		}else {
			System.out.println("YES");
		}
	}
}
  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值