AcWing1204.错误票据——学习笔记

news2024/9/29 5:32:45

 题目:1204. 错误票据 - AcWing题库icon-default.png?t=MBR7https://www.acwing.com/problem/content/description/1206/


import java.util.Scanner;

public class Main {
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        int line = input.nextInt();
        int loseId = -1;
        int repeatId = -1;
        //数据处理
        StringBuilder ID = new StringBuilder();
        for(int i = 0; i <= line; i++){
            String temp = input.nextLine();
            ID.append(new StringBuilder(temp));
            ID.append(new StringBuilder(" "));
        }
        String sId = ID.toString();
        String[] strId = sId.split(" ");
        int[] intId = new int[strId.length];
        for (int i = 0; i < strId.length; i++){
            try {
                intId[i] = Integer.valueOf(strId[i]);
            }catch (NumberFormatException e){

            }

        }
        //冒泡排序
        for(int i = 0; i < intId.length - 1; i++){
            for (int j = i+1; j < intId.length; j++){
                if(intId[i] > intId[j]){
                    int temp = intId[i];
                    intId[i] = intId[j];
                    intId[j] = temp;
                }
            }
        }
        //遍历
        for(int i = 1; i < intId.length; i++){
            if(intId[i] - intId[i - 1] > 1){
                loseId = intId[i - 1] + 1;
            }
            if(intId[i] == intId[i - 1]){
                repeatId = intId[i];
            }
        }
        //输出
        System.out.println(loseId + " " + repeatId);
    }
}

 


思路:获取第一行的数值并记录在line变量中,循环line次获取每一行的ID号。使用StringBuilder对ID号进行规范化处理并将其转为int类型,然后对int类型的ID号数组进行排序。然后找出相邻两个数差值大于1的位置,即为缺失的ID;排序后,相邻的元素不相同,那么他们就不是重复元素,反之,即为重复元素。

一、准备阶段

        Scanner input = new Scanner(System.in);
        int line = input.nextInt();
        int loseId = -1;
        int repeatId = -1;

因为后续需要从键盘中输入数据,需要一个Scanner。将第一行的数据存放在line变量,表示后续有几行ID,loseId表示确实的ID号,repeatId表示重复的ID号。

二、数据处理

        //数据处理
        StringBuilder ID = new StringBuilder();
        for(int i = 0; i <= line; i++){
            String temp = input.nextLine();
            ID.append(new StringBuilder(temp));
            ID.append(new StringBuilder(" "));
        }
        String sId = ID.toString();
        String[] strId = sId.split(" ");
        int[] intId = new int[strId.length];
        for (int i = 0; i < strId.length; i++){
            try {
                intId[i] = Integer.valueOf(strId[i]);
            }catch (NumberFormatException e){

            }

        }

大概思路是,不管多少行,先把所有行全加在一起再说。因此需要一个StringBuilder用于动态增加字符串。然后通过Scanner获取到输入的字符串然后使其变为一个新的StringBuilder并统一加在ID这个变量后面。值得注意的是,有可能某一行的最后一个元素后没有跟空格,若直接链接起来,会导致上一行的最后一个数与下一行的第一数拼接在一起(如:上一行最后一个数为12,下一行的第一个数为7,若不做处理则,最后两者拼接为127)从而影响后续判断。因此,不管输入是否全都有空格,只要录入时换行我们就直接自动添加一个空格。然后将完成链接的StringBuilder转换为String类型,通过split方法对有空格处进行分割并存入int数组内。因为在前面(粉色标记)作了加空格处理,对于原本格式就对的行我们再加一个空格那就一共有两个空格,因此再split时,会导致有空缺位出现,而当空格使用Integer.valueOf()转为int类型时会报错。因为这些空格并非我们需要的数据,这些空格对实际判断没有作用,所以我们将这些错误捕获起来,不需要做处理,仅为了代码可以正常跑下去。

三、排序

        //冒泡排序
        for(int i = 0; i < intId.length - 1; i++){
            for (int j = i+1; j < intId.length; j++){
                if(intId[i] > intId[j]){
                    int temp = intId[i];
                    intId[i] = intId[j];
                    intId[j] = temp;
                }
            }
        }

完成上述数据处理,现在得到一个int类型的数组存放ID。接下来就是排序,这里我使用了冒泡排序,如果想提升效率可以使用更高级一些的排序方法。将数组中的元素排好序,方便后续判断。

四、遍历并判断

        //遍历
        for(int i = 1; i < intId.length; i++){
            if(intId[i] - intId[i - 1] > 1){
                loseId = intId[i - 1] + 1;
            }
            if(intId[i] == intId[i - 1]){
                repeatId = intId[i];
            }
        }

遍历这个int类型数组,进行判断。如果两个相邻的ID差值大于1,则意味着中间缺失了一个ID,将前一个值+1即可以得到loseId;因为经历了上述的排序,重复的ID必定相邻,因此只需要比对相邻的ID是否一样,如果一样则为找到重复元素了。

五、输出

        //输出
        System.out.println(loseId + " " + repeatId);

最后按题目要求的格式输出即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python开发环境

1. Python开发环境 开发环境&#xff0c;英文是IDE&#xff08;Integrated Development Environment 集成开发环境&#xff09;。 不要纠结于使用哪个开发环境。开发环境本质上就是对Python解释器python.exe的封装&#xff0c;核心都一样。可以说:“开发环境IDE&#xff0c;只…

SpringCloud(10)— Elasticsearch集群

SpringCloud&#xff08;10&#xff09;— Elasticsearch集群 一 搭建ES集群 单机的 Elasticsearch 做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题&#xff0c;单点故障等 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为 N 个分片&#xff08;…

直播回顾 | 如何运用数智化助力光伏上游产业节能降碳?

12月29日&#xff0c;【始祖双碳研习社-行业解决方案】系列直播课第一期直播顺利举办。 始祖科技解决方案专家张开宇在本次直播上进行了以《如何运用数智化助力光伏上游产业节能降碳》的主题分享&#xff0c;详细介绍了光伏行业产业链分析、光伏行业节能减排的现状与挑战、数智…

【Javassist】快速入门系列12 当检测到catch语句时在catch前插入代码

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

【C++学习】vector的使用及模拟实现

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; vector的使用及模拟实现&#x1f387;构造函数&#x1f9e8;模拟实现&#x1f9e8;vector的扩容机制&…

力扣(LeetCode)363. 矩形区域不超过 K 的最大数值和(2022.12.30)

给你一个 m x n 的矩阵 matrix 和一个整数 k &#xff0c;找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,0,1],[0,-2,3]], k 2 输出&#xff1a;2 解释&…

2022年-年度总结报告

目录1.攻克的技术难题问题1&#xff1a;2.学习的新技术1.system系统的学习2.网络3.游戏22年总结23年的计划1.先给自己画个大饼2.计划内的小饼1.攻克的技术难题 问题1&#xff1a; 跑VTS测试的时候&#xff0c;mkfs.exfat挂测失败&#xff0c;VTS刷最新的谷歌gsi没有过&#x…

大文件传输如何帮助媒体行业

过去几年&#xff0c;随着分辨率从4k到6k再到8k的升级&#xff0c;观众已经适应了高分辨率的时代。然而&#xff0c;许多媒体工作室的工作流程还停留在过去。 TB甚至PB大小的材料的传输让从业者无所适从。这就是高速文件传输对媒体行业有很大帮助的原因。 什么是大文件传输&am…

81.【SpringMVC】

SpringMVC(一)、认识MVC三层架构1.回顾MVC(1).什么是MVC三层框架(2).MVC要做那些事情?(3).常见的MVC三层框架结构(4).知识拓展2.代码回顾3.什么是SpringMVC(二)、第一个SpringMVC0.前提1.搭建环境2.配置WEB-INF的XML配置文件3.在资源Resource的包下设置springmvc-servlet.xml4…

30-深入Hotspot源码与Linux内核理解NIO/BIO/AIO

IO模型 IO模型就是说用什么样的通道进行数据的发送和接收&#xff0c;Java共支持3种网络编程IO模式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO BIO(Blocking IO) 同步阻塞模型&#xff0c;一个客户端连接对应一个处理线程 缺点&#xff1a; 1、IO代码里read操作是阻塞操…

Spreadsheet与FineReport数据集对比

什么是数据集&#xff1f;在BI工具中指的是在报表开发前的取数过程&#xff0c;把需要的数据整合成一个数据集合&#xff0c;以便于在报表开发中使用。可以把它理解为我们基于数据库获取我们需要的数据。而数据库获取数据是有多种方式的&#xff0c;比如可以通过直接写SQL语句、…

基于verilog实现序列相关检测

题目来源牛客网&#xff0c;完整工程源码&#xff1a;https://github.com/ningbo99128/verilog 目录 1、VL25 输入序列连续的序列检测 题目介绍 思路分析 代码实现 仿真文件 2、VL26 含有无关项的序列检测 题目介绍 思路分析 代码实现 仿真文件 3、VL27 不重叠序列检…

Sleuth+Zipkin架构

为什么要链路追踪 小结&#xff1a; nacos 【name server】&#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos【config】&#xff1a;配置中心&#xff0c;微服务配置文件的中心化管理&#xff0c;同时配置信息的动态刷新 Ribbon&#xff1a;客户端负载均衡器&#…

《设计模式》享元模式

《设计模式》享元模式《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 《设计模式》建造者模式 《设计模式》适配器模式 《设计模式》桥接模式 《设计模式》装饰者模式 《设计模式》组合模式 《设计模式》外观模式 《设计模式…

数据结构课设:迷宫问题

文章目录前言一、概要设计1、基本信息2、功能模块图3、功能描述4、调用关系图5、结果演示① 创建迷宫② 求解③ 清除多余路径二、完整代码前言 最近刚好在写自己的课设&#xff0c;匆匆忙忙写出来的课设系统&#xff0c;仍有不足&#xff0c;拿出来和大家分享一下&#xff0c;…

C. p-binary(二进制位)

Problem - 1225C - Codeforces Vasya会看中任何数字&#xff0c;只要它是2的整数次方。另一方面&#xff0c;Petya非常保守&#xff0c;只喜欢单一的整数p&#xff08;可以是正数、负数或零&#xff09;。为了结合他们的口味&#xff0c;他们发明了2xp形式的p-二进制数&#xf…

jmeter接口测试之导入测试用例/get请求中Url存在参数(工作日记2)

导入接口用例进行接口测试 以运营中心测试计划中的企业菜单管理为例 【前提条件】 1、有接口数据 2、有接口用例 我们需要把接口测试用例转换为CSV格式步骤如下&#xff1a; 右键选择打开方式为Notepad 需要将文件设置一下编码 文件留着备用 【步骤】 1、新建一个企业…

前端基础之PS和相关基础知识总结

PS安装&#xff1a; 淘宝 PS简介 面板简介&#xff08;菜单栏、工具栏、辅助面板&#xff09; 图片格式&#xff1a; jpgjpeg&#xff08;色彩丰富的图片&#xff09;png&#xff08;半透明图片&#xff09;gif&#xff08;网页动态图&#xff09;psd&#xff08;ps设计源文…

android java udp广播 用于局域网搜索扫描设备。

DatagramSocket socket new DatagramSocket();//设置接收等待时长socket.setSoTimeout(LanCommConfig.RECEIVE_TIME_OUT);byte[] sendData new byte[1024];//使用广播形式&#xff08;目标地址设为255.255.255.255&#xff09;的udp数据包DatagramPacket sendPacket new Dat…

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示

STC15单片机+DS18B20+LCD1602+PCF8574转IIC接口温度显示 📺显示效果 LCD1602 IIC接口 ✨本示例基于自制的STC开发板,主控采用的:IAP15W4K61S4相关篇《【PCB开源分享】STC/IAP15W4K61S4开发板》《【开源分享】自制STC15W408AS开发板》🌼接线说明 🌿CD1602+PCF8574转IIC接…