
题目解析
根据题目要求,一串数据里面存在一个断号,一个重号。也就是说,如果将这串数字按顺序排好之后,正常情况下两个数之间都是相差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);
}
}
···