LintCode算法题
本人的拙见,不保证为最佳算法,只为通过本题。
846.多关键字排序
给定 n 个学生的学号(从 1 到 n 编号)以及他们的考试成绩,表示为(学号,考试成绩),请将这些学生按考试成绩降序排序,若考试成绩相同,则按学号升序排序。
样例
样例1
输入: array = [[2,50],[1,50],[3,100]]
输出: [[3,100],[1,50],[2,50]]
样例2
输入: array = [[2,50],[1,50],[3,50]]
输出: [[1,50],[2,50],[3,50]]
public class apopopoppo {
public static void main(String[] args) {
int[][] array = {{0, 30}, {15, 20}, {36, 40}, {91, 10}, {84, 10}, {39, 10}};
// System.out.println(array[0].length);
System.out.println(sort(array));
}
private static int[][] sort(int[][] array) {
if (array.length == 0)
return array;
Arrays.sort(array, Comparator.comparingInt(o -> o[1]));
int[][] array2 = new int[array.length][array[0].length];
int count = 1;
for (int i = 0; i < array.length; i++) {
array2[i] = array[array.length - 1 - i];
}
for (int i = 0; i < array2.length - 1; i++) {
if (array2[i][1] == array2[i + 1][1])
count++;
if (array2[i][1] != array2[i + 1][1] && count != 1) {
Arrays.sort(array2, i - count + 1, i + 1, Comparator.comparingInt(o -> o[0]));
count = 1;
}
}
//对最后一位进行学号升序排序
int num = array2[array2.length - 1][1], count2 = 0;
for (int i = 0; i < array2.length - 1; i++) {
if (array2[i][1] == num)
count2++;
}
/*sort排序算法中的起始和截止参数fromIndex、toIndex
fromIndex=1,toIndex=4 是从第二个到第四个
fromIndex=0,toIndex=3 是从第一个到第三个*/
Arrays.sort(array2, array2.length-count, array2.length, Comparator.comparingInt(o -> o[0]));
//输出二维数组
// for (int[] arr : array2) {
// for (int a : arr) {
// System.out.print(a + " ");
// }
// System.out.println();
// }
return array2;
}
}