题目来自于http://blog.csdn.net/column/details/huaweicode.html?&page=4,原文均是用的c++,我用的java写的。
题目描述
实现输入一组大于等于0的整数,根据从小到大的顺序排序后输出,排序后有连续数时,只输出连续数中最小和最大的两个数。
题目类别: 排序
难度: 高级
运行时间限制: 10Sec
内存限制: 128MByte
阶段: 入职前练习
输入:
一组大于等于0的整数,不考虑非法输入,各个整数之间以逗号(“,”)分隔, 输入字符串的总长度小于等于100个字节。
输出:
排序后的值,各个整数之间以空格分隔。
样例输入:
1,4,3,110,2,90,7
样例输出:
1 4 7 90 110
代码
// 我的解决思路:先将该数组排序,然后查出需要删除的个数,最后把需要删除的删除掉。
public class num3 {
public static void main(String[] args) {
Scanner sn = new Scanner(System.in);
String s = sn.nextLine();
String s1[];
s1 = s.split(",");
int length = s1.length;
int[] array = new int[length];
for (int i = 0; i < length; i++) {
array[i] = Integer.parseInt(s1[i]);
}
//先进行选择排序
chooseSort1(array);
int a[] = doit(array);
length = a.length;
for (int i = 0; i < length; i++)
System.out.println(a[i]);
}
//找出需要删除的数字个数
private static int getNeedCleanNum(int a[]) {
int length = a.length;
int count = 0;
for (int i = 0; i < length; i++) {
boolean begin = true;
boolean end = true;
if (i - 1 >= 0) {
if (a[i - 1] + 1 == a[i])
begin = false;
}
if (i + 1 < length) {
if (a[i + 1] == a[i] + 1)
end = false;
}
if (begin == false && end == false) {
count++;
}
}
return count;
}
public static int[] doit(int a[]) {
int length = a.length;
int[] b = new int[length - getNeedCleanNum(a)];
int index = 0;
//将需要的元素进行复制,要删除的元素不再进行复制
for (int i = 0; i < length; i++) {
boolean begin = true;
boolean end = true;
if (i - 1 >= 0) {
if (a[i - 1] + 1 == a[i])
begin = false;
}
if (i + 1 < length) {
if (a[i + 1] == a[i] + 1)
end = false;
}
if (begin || end) {
b[index++] = a[i];
}
}
return b;
}
/**
* @ 选择排序
*/
public static int[] chooseSort1(int a[]) {
int length = a.length;
for (int i = 0; i < length; i++) {
int tem = i;
for (int j = i + 1; j < length; j++) {
if (a[tem] > a[j]) {
tem = j;
}
}
if (tem != i) {
int t = a[tem];
a[tem] = a[i];
a[i] = t;
}
}
return a;
}
}