阿里笔试共一个小时,两道编程题目,平台为牛客网。
没做出来,重在参与了。第一题有思路,但是后来经验证还是有漏洞,遂去牛客找大佬的思路,因此用本博客来记录一下打怪生涯。
第一题:有n个人,每人有对应的钱币,有m个房子,每个房子有对应的价值和舒适度。
每个人只能买一个房子,每个房子只能被一个人买,求最大的舒适度和。
思路:贪心算法,让每个人买能够买范围内舒适度最高的房子。需注意要让钱少的人优先买,不然可能会造成钱多的人把价格低但舒适度高的房子买走,导致钱少的人没钱买房子的现象。
Talk is cheap, show me the code.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class ALiTest1 {
public static void main(String[] args) {
//读取数据
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //n为朋友的数量
int m = sc.nextInt(); //m为房子的数量
int[] moneyPerFriend = new int[n]; //记录每个朋友的金币数
for (int i = 0; i < n; i++) {
moneyPerFriend[i] = sc.nextInt();
}
List<int[]> houseAttr = new ArrayList<>(); //使用ArrayList来添加房子的属性
for (int i = 0; i < m; i++) {
int[] house = new int[2];
house[0] = sc.nextInt(); //第一个属性为房子的价格
house[1] = sc.nextInt(); //第二个属性为房子的舒适度
houseAttr.add(house);
}
long comfortSum = 0; //舒适度和,数据很大,用long来存储
Arrays.sort(moneyPerFriend); //按朋友的金币数排序
for (int i = 0; i < n; i++) {
int comfort = 0; //对每个朋友来说,初始化舒适度为0
int index = -1; //用一个index来记录这个朋友最终买了哪套房子
for (int j = 0; j < houseAttr.size(); j++) {
if (moneyPerFriend[i] >= houseAttr.get(j)[1] && houseAttr.get(j)[0] >= comfort){
comfort = houseAttr.get(j)[0];
index = j;
}
}
if (index != -1){
houseAttr.remove(index);
}
comfortSum+=comfort;
}
sc.close();
System.out.println(comfortSum);
}
}
笔试题第二题会在之后记录。
代码还有很多可以优化的地方,只是将思路展现给大家,也用来记录自己打怪升级的过程。