法1:布尔数组 //该题输入部分 输入的数据量不确定 但是可以确定输入多少行 可以先Scanner接收int行数n 再分行接收n个string
// 再将string 转换为int类型
//找重复数的基本思想:布尔数组 表示每个数是否出现过 每遍历一个数就存储true 当某个数重复出现时,那它已经为true了,就可以通过判断条件,这个数就是重复的数
//找缺失数的基本思想:不断将新加进来的数进行比较 所有数都遍历完之后 可以得到max和min,遍历min到max,在布尔数组里存在的数肯定为true 不存在的为false 所以就可以通过判断条件找到这个缺失的数
import java.util.Scanner;
public class Main {
static int N=100010;
static int cid;
static int aid;
static int n;
static boolean[] b=new boolean[N];//每个数是否出现过
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=Integer.parseInt(sc.nextLine());
//写法一int n=Integer.parseInt(sc.nextLine());它可以不用再消耗换行符了
//写法二int n=sc.nextInt();sc.nextLine();
// 主要就是这里 要消耗掉一个换行符 否则它可能会影响接下来的 nextLine() 调用
//之前没加这一行的时候就是在int t = Integer.parseInt(strs[j]);那一直输出报错 当strs[j] 是一个空字符串时,抛出异常。可能是因为输入数据中存在额外的空格
int min=100000;
int max=-100000;
for(int i=0;i<n;i++){
String[] strs=sc.nextLine().split(" ");
for(int j=0;j<strs.length;j++){
int t = Integer.parseInt(strs[j]);
max = Math.max(max, t);
min = Math.min(min, t);
if (b[t]) {
cid = t;
} else {
b[t] = true;
}
}
}
for(int i=min;i<=max;i++){
if(!b[i]){
aid=i;
break;
}
}
System.out.println(aid+" "+cid);
}
}
法1ac通过
法2:将输入数据存储到一个arraylist中 再对arraylist进行sort排序 重叠的数肯定就被放在一块了 相邻两个数差值大于等于2那它们之间肯定有缺失值 通过遍历分别找出缺失数和重复数
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
ArrayList<Integer> a=new ArrayList<>();
int n=Integer.parseInt(sc.nextLine());
Integer aid=0;Integer cid=0;
for(int i=0;i<n;i++){
String[] str=sc.nextLine().split(" ");
for(int j=0;j< str.length;j++){
a.add(Integer.parseInt(str[j]));
}
}
//这个排序也可以用 a.sort(null);
Collections.sort(a);
for(int i=0;i<a.size()-1;i++){
if(a.get(i).equals(a.get(i+1))){
//存储在 ArrayList 中的对象,如果你想要比较它们是否相等,通常应该使用 equals() 方法,
//如果这里用的是==,部分测试情况下会cid最终结果会为0
cid=a.get(i);
}
}
for(int i=0;i<a.size()-1;i++){
if(a.get(i+1)>=a.get(i)+2){
// 如果你正在处理的是基本数据类型的包装类(如 Integer, Double 等),并且你想要比较它们的数值内容,那么你可以直接使用 >= 运算符
aid=a.get(i)+1;
break;
}
}
System.out.println(aid+" "+cid);
}
}
法2ac通过