双属性排序
新入职的n名员工参加了异常编程大比拼,编号从1到n,现在给出n名员工的代码鲁棒性值和代码规范性之,请按照代码鲁棒性值由高到底对这n名员工进行排序,如果代码鲁棒性值相同,则按照代码规范性值由高到底排序
思想
这是一个双属性排序的问题,在java8之前,我们可以自定义Comparator,相对比较复杂
有了java8,这个问题及简单的多了
源码
import java.util.*;
public class HcTest {
static class Staff{
int num;
int lu;
int gui;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getLu() {
return lu;
}
public void setLu(int lu) {
this.lu = lu;
}
public int getGui() {
return gui;
}
public void setGui(int gui) {
this.gui = gui;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
if (num < 1 || num > 5000)
return ;
Staff[] s = new Staff[num];
for (int i = 0; i < num; i++) {
Staff staff = new Staff();
staff.setNum(i);
staff.setLu(in.nextInt());
s[i] = staff;
}
for (int i = 0; i < num; i++) {
s[i].setGui(in.nextInt());
}
List<Staff> ss = Arrays.asList(s);
ss.sort(Comparator.comparing(Staff::getLu).reversed().thenComparing(Staff::getGui,Comparator.reverseOrder()));
for (Staff staff : ss) {
System.out.println(staff.getLu() + " " + staff.getGui());
}
}
}
结果
注意第一个降序用的是reversed(),第二个降序用的是Comparator.reverseOrder()
关于Comparator.reverseOrder()与Comparator.compare ()的区别,可以看看这个博主的源码解析:深入学习java源码之Comparator.reverseOrder()与Comparator.compare ()
求连续子数组
小民有一个长度为n的数列A。小民想知道数列中有多少个子数组[l,r]之和是立方数,即从序列第l个元素开始到第r个元素之和。
立方数是指某个整数的立方(三次方),比如1,0,8都是立方数,2,9不是
思想
典型的动态规划问题
源码
动态规划讲解:
- https://cloud.tencent.com/developer/article/1538177
- https://www.zhihu.com/question/39948290/answer/883302989