蓝桥杯普及题:错误票据

417 阅读3分钟

题目解析

根据题目要求,一串数据里面存在一个断号,一个重号。也就是说,如果将这串数字按顺序排好之后,正常情况下两个数之间都是相差1,都是连续的。如果出现了断号,那么某两个数之间就会相差2;如果是重号,则代表某两个相连的数相同。

技术实现

这里可以现将获取到的多行数据合并成一个字符串,再将字符串里的数据一个个截取出来放进数组中。截取的方式我目前掌握的有两种:一种是使用java里面的split()方法进行截取,使用这个方法可以精准的获取到数据的个数,这样定义的数组就不会浪费空间了;另一种方法是通过正则表达式进行截取,这种方法因为不知道截取的数据具体是多少个,但是题目要求不会100000个,可以先定义好数组大小,不过这样比较浪费内存。

将数据截取出放进数组后,就可以对数组进行排序了。排序的方式可以用冒泡排序法,也可以直接调用Arrays类的sort()方法进行排序。这两种方法我都试了一下。

这里有个要注意的地方,就是截取数据的时候要注意到两个数之间不一定是一个空格,可能是多个空格,我一开始做错了就是忽略了这个地方

package _12_26_test;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

/*错误票据
 * 
 * 字符串中字符的截取(字符串中包含空格)
 * 升序排序
 * 后一个数-前一个数!=1,则断号、
 * 后一个数-前一个数==,则重号
 * 
 * 
 * */
public class fifteen {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner scanner = new Scanner(System.in);

//		获取数据N,这里得注意把多余的空格去掉
		int lineNum = Integer.parseInt(scanner.nextLine().trim());

		String s = "";

//		得到后面的几行数据,并将多行数据连城一个字符串,方便后面字符串的截取
		for (int i = 0; i < lineNum; i++) {
			s = s + scanner.nextLine().trim() + " ";
		}
		
		
		// 方法一:通过split()方法对字符串进行截取
		String num[] = s.trim().split("\\s+");
		
//		将字符串数组转换成int类型的数组,方便后面数组的排序
		int ID[] = new int[num.length];
		for (int i = 0; i < num.length; i++) {
			ID[i] = Integer.parseInt(num[i]);
		}

		// 对数组进行升序排序:冒泡排序法、调用API排序
		
		// 方法一:冒泡排序法
		/**
		boolean g = true;
		while (g) {
			boolean flag = true;
			int tem;
			for (int i = 0; i < ID.length - 1; i++) {
				// 如果后一位数小于前一位数,俩数进行换位
				if (ID[i + 1] < ID[i]) {
					tem = ID[i];
					ID[i] = ID[i + 1];
					ID[i + 1] = tem;
					flag = false;
				}
				if ((i == ID.length - 2) && flag) {
					g = false;
				}
			}
		}
		**/

		// 方法二:调用API
		 Arrays.sort(ID);

		int m = 0;
		int n = 0;

		/**对排序后的数组进行比较**/
		for (int i = 0; i < ID.length - 2; i++) {
//			如果两个数之间相差大小等于2,则说明这两数之间断号;
			if (ID[i + 1] - ID[i] == 2) {
				m = ID[i] + 1;
			}
//			如果两数之间相差0,则说明这两数重复
			if (ID[i + 1] - ID[i] == 0) {
				n = ID[i];
			}
		}

//		结果输出
		System.out.println(m + " " + n);

	}

}

···