阿里巴巴实习生【四月一日】笔试题

两题
这次真的有点简单,不用DP就能过(不会DP的我暗自开心)。

1.暴力题

给定T个“01”字符串,定义翻转:0->1,1->0,每一次翻转会将翻转本位置和相邻(间隔为1)的位置的字符,问最少需要多少次翻转才能变成全为0的字符串,无法全0输出NO

如“011”->"000",翻转下标为2(从零开始)的位置就能变成全0串,答案为1

T<=100

len(字符串)<=20

思路:

这个题直接位运算暴力即可

2.贪心题

有n个怪物,每个怪物有一定的血量,你有m支箭,每支箭有伤害值和花费,每个怪物只能中一箭,当伤害值大于等于怪物的血量怪物就被消灭,

问消灭全部怪物的最小花费是多少,如果不能全部消灭输出NO。

有T组数据

每组数据中

两个整数n,m,n是怪物的数量,m是箭的数量

下面有三行

数组a[n] n个数 ,代表怪物的血量

数组b[m] m个数 , 代表箭的伤害值

数组c[m] m个数 ,代表箭的花费

思路:

从大到小遍历怪物血量
每次判断杀死怪物前,将伤害值大于等于当前怪物血量的箭加入到优先队列中(花费越小,优先级越高)
如果优先队列不为空,选取队顶的箭并出队,将其花费加入到答案中
如果优先队列为空,则这个怪物无法被杀死,输出no

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

/**
 * @Author: Shang Huaipeng
 * @Version 1.0
 */
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        int a[]=new int[100000+10];
        int b[]=new int[100000+10];
        int c[]=new int[100000+10];
        for(int k=0;k<T;k++) {
            int n=sc.nextInt();
            int m=sc.nextInt();
            PriorityQueue<int[]> que1 = new PriorityQueue<int[]>((a1,a2)->{//[0]伤害[1]费用
                if(a1[0]!=a2[0])return a2[0]-a1[0];
                else return a1[1]-a2[1];
            });
            PriorityQueue<int[]> que2 = new PriorityQueue<>((a1,a2)->{//费用小的优先级高
                if(a1[1]!=a2[1])return a1[1]-a2[1];
                else return a1[0]-a2[0];
            });
            for(int i=0;i<n;i++){
                a[i]=sc.nextInt();
            }
            for(int i=0;i<m;i++){
                b[i]=sc.nextInt();
            }
            for(int i=0;i<m;i++){
                c[i]=sc.nextInt();
                que1.offer(new int[]{b[i],c[i]});
            }
            Arrays.sort(a,0,n);
            long ans=0;
            for(int i=n-1;i>=0;i--){
                while(!que1.isEmpty()&&que1.peek()[0]>=a[i]){
                    que2.offer(que1.poll());
                }
                if(que2.isEmpty()){
                    ans=-1;
                    break;
                }
                else ans+=que2.poll()[1];
            }
            if(ans==-1) System.out.println("No");
            else System.out.println(ans);
        }
    }
}
#阿里巴巴笔试##阿里巴巴##笔试题目#
全部评论
请问楼主,阿里笔试,都是这种一行一行输入吗?入参只能通过Scanner来获取吗?
点赞 回复 分享
发布于 2022-03-01 14:35
楼主太强了
点赞 回复 分享
发布于 2020-04-01 18:15
楼主能说一下第一题的具体思路吗
点赞 回复 分享
发布于 2020-04-01 17:55
哇,大佬,0 分菜鸡路过
点赞 回复 分享
发布于 2020-04-01 17:14

相关推荐

2025-12-08 16:04
门头沟学院 Java
本人本科末9,今年大三。大一大二一直玩,什么都没学到,在大学混日子混了两年,每天不是在打农就是在steam。大三开学时一个和自己玩的好的同学去实习了,才发现自己白白浪费了两年的时间,如果真不冲一下就真去京东,阿里,美团送外卖了今年9月份开始学Java,一开始一直跟着黑马视频看,后面发现看视频效率太低了,时间根本不够,就开始主要看文档和看书了。这几个月一直在学,真的尽力了,希望暑期前能找一份好点的实习。我简历上面的项目大多没有指标,但是实际上我是真没多少时间去做项目,我基本主要是动手只做了外卖和天机,黑马点评和12306我都是只是看了项目。主要是自己的时间真的不多,但是这样子自己的代码能力确实比较差。而且自己也没有做过实际的工程,我顶多用jmeter测试一下接口tps啥的,比如使用Redis管道提升了一点性能,减少Redis交互,这种值得写上去吗?需不需要具体到某些数字求求各位佬给一些建议,看看简历怎么优化?项目介绍是不是不够详细?没有具体到业务方面。项目会不会提到大致实现原理导致面试官一看简历就知道怎么实现就没有问的欲望?专业技能一些字段是不是要加粗,是不是写太啰嗦了?有没有必要压缩内容变成一页?两页的话是不是都要把两页填地满满的。
给秋招一个交代:一页简历最好,网上做的项目放面试官眼里都是玩具,简历上不需要强调有什么难点,记住就行防止真的问。然后背八股,多投多面试就行
点赞 评论 收藏
分享
评论
2
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务