Acwing1204错误票据java两种解法


法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通过

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值