JAVA-蓝桥杯-历届试题 错误票据

本文介绍了一种通过编程解决票据断号和重号问题的方法。在一个涉密单位年终收回连续编号的票据过程中,由于录入错误导致了一个ID断号和一个ID重号。文章详细描述了如何通过输入数据,使用插入排序算法对ID号进行排序,然后对比连续的ID号,最终找出断号和重号的具体ID。
问题描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入格式
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内
和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID

代码如下:


import java.util.Arrays;
import java.util.Scanner;
public class Main {

	/**
	 * 
	 */
	public static void f(int arr[]){  //插入排序
		for (int i = 1; i <arr.length; i++) {
			int a =arr[i];
			int j = i-1;
			while (j>=0&&arr[j]>=a) {
				arr[j+1]=arr[j];
				j--;
			}
			arr[j+1]=a;
		}
	}
	public static int f1(int arr[]){ //获取第一个不为0的数的下标
		int j = 0;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i]!=0) {
				j= i;
				break;
			}
		}
		return j;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();  //输入字符串个数
		String arr[]=new String [a]; //声明一个数组
		String s=sc.nextLine();	 //输入字符串
		int length=0; //用于累加下标值
		int num[]=new int[100]; //定义一个长度为100的数组存放数字
		for (int i = 0; i <a; i++) { 
			s=sc.nextLine(); 
			arr[i]=s; //存入数组中
			String[]ch = arr[i].split(" ");  //分隔字符串,以空格为分隔符
			for (int k = 0,j=length; k <ch.length; k++) {
				num[j]=Integer.parseInt(ch[k]);   //转化为整型,并且存入数组中
				j++; //统计下标累加
			}
			length+=ch.length;//累加下标
		}
		f(num); //调用函数进行排序
		int num1[]=new int[100]; //重新定义一个数组,用于下面的比较
		int r = f1(num);  //获取排序后第一个不为0的数字的下标
		int q = num[r];   //下标值
		for (int i = r; i < num.length; i++) {
			num1[i]=q; //重新构造一个数组,储存从q值开始连续不间断的数组,用来原数组的比较
			q++;
		}
		int y = 0; //计数
		int sum[]=new int[2];//获得的值存入数组中,只有两个,一个是重复的,一个是间断的
		for (int i = r,j=r; i < num1.length; i++) {
			if ((num[i]^num1[j])!=0&&num1[i]<num[j]) {	 //对应的下标位置进行按位异或,等于0说明相同,不等于0说明不相同
				if(y==1){
				sum[1]=num1[i];
					break;
				}else{
					sum[0]=num1[j];
					y++;
					j=j+1;	
				}	
			}
			if ((num[i]^num1[j])!=0&&num1[i]>num[j]) {
				if(y==1){
					sum[1]=num[i];
					break;
				}else{
					sum[0]=num[i];
					y++;
					j=j+1;
				}	
			}
			j++;
		}		
			System.out.println(sum[0]+" "+sum[1]);
		
	}
}

7
2066 2052 2025 2068 2027 2093 2069 2016 2022 2026 2011 2091 2028 2013 2054 2065
2086 2036 2097 2001 2062 2064 2037 2039 2013 2041 2021 2077 2063 2060 2030 2089
2080 2032 2044 2067 2040 2056 2082 2057 2043 2079 2045 2058 2095 2035 2081 2046
2024 2009 2073 2085 2098 2049 2094 2071 2050 2019 2072 2076 2034 2017 2051 2048
2008 2007 2029 2061 2010 2018 2042 2004 2006 2023 2084 2059 2083 2099 2033 2090
2012 2070 2087 2074 2005 2078 2038 2014 2092 2015 2031 2055 2075 2047 2002 2020
2003 2053 2088

结果:2013 2096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值