美团 8月10日笔试第二题
题目:清除数组的最小花费
大佬们,帮忙看下,这个代码的思路有什么问题呢,测试用例过了,但是提交上去后只过了15%。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int count = in.nextInt();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < count; i++) {
int n = in.nextInt();
int k = in.nextInt();
int x = in.nextInt();
HashMap<Integer, Integer> map = new HashMap<>();
ArrayList<Integer> list = new ArrayList<>();
for (int j = 0; j < n; j++) {
int num = in.nextInt();
map.merge(num, 1, Integer::sum);
list.add(num);
}
int min = getFirstMinNum(map);
int minRes = Math.min(n * x, k * min);
for (int j = 0; j < list.size(); j++) {
if (list.get(j) < min) {
assert map.containsKey(list.get(j));
if (map.get(list.get(j)) == 1) {
min = list.get(j);
map.remove(list.get(j));
} else {
Integer v = map.get(list.get(j));
map.put(list.get(j), v - 1);
}
}
int tempRes = k * min + x * (j + 1);
if (tempRes < minRes) {
minRes = tempRes;
}
}
arrayList.add(minRes);
}
in.nextLine();
arrayList.forEach(System.out::println);
}
}
private static int getFirstMinNum(HashMap<Integer, Integer> map) {
int i = 0;
for (; i<= 200000; i++) {
if (!map.containsKey(i)) {
return i;
}
}
return i;
}
大佬们,帮忙看下,这个代码的思路有什么问题呢,测试用例过了,但是提交上去后只过了15%。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int count = in.nextInt();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < count; i++) {
int n = in.nextInt();
int k = in.nextInt();
int x = in.nextInt();
HashMap<Integer, Integer> map = new HashMap<>();
ArrayList<Integer> list = new ArrayList<>();
for (int j = 0; j < n; j++) {
int num = in.nextInt();
map.merge(num, 1, Integer::sum);
list.add(num);
}
int min = getFirstMinNum(map);
int minRes = Math.min(n * x, k * min);
for (int j = 0; j < list.size(); j++) {
if (list.get(j) < min) {
assert map.containsKey(list.get(j));
if (map.get(list.get(j)) == 1) {
min = list.get(j);
map.remove(list.get(j));
} else {
Integer v = map.get(list.get(j));
map.put(list.get(j), v - 1);
}
}
int tempRes = k * min + x * (j + 1);
if (tempRes < minRes) {
minRes = tempRes;
}
}
arrayList.add(minRes);
}
in.nextLine();
arrayList.forEach(System.out::println);
}
}
private static int getFirstMinNum(HashMap<Integer, Integer> map) {
int i = 0;
for (; i<= 200000; i++) {
if (!map.containsKey(i)) {
return i;
}
}
return i;
}
全部评论
涉及乘法的都换成long
long
相关推荐
点赞 评论 收藏
分享
06-04 10:32
安徽大学 单片机 实习僧和BOSS直聘都投了几十家,硬件开发,硬件测试,嵌入式都投了,全是已读不回……我现在考虑想在秋招前速成一个Linux项目,其实现在完全不知道自己要找什么方向的,只能海投了,求大佬们给点意见😭😭😭

点赞 评论 收藏
分享