阿里巴巴3.8技术岗笔试题

第一题
给你N个正整数,从小到大排序,然后问从第一个数字开始没出现的第k个正整数是多少。
T组  1<=T<=1000
1<=N<=1e5    1<=k<=1e8
比如
1
5 2
3 4 6 7 9
第一个没出现的是5  第二个没出现是8
所以输出8

AC代码:
/*
 * @Author: 7QQQQQQQ
 * @IDE: vscode
 * @Date: 2021-03-08 18:49:21
 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e6+50;
ll a[N],b[N];
int main(){
    int T;cin>>T;
    while(T--){
        int n,k;cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        for(int i=1;i<n;i++){
            b[i]=a[i+1]-a[i]-1;
        }
        int flag=0;
        for(int i=1;i<n;i++){
            if(k>b[i]) k-=b[i];
            else{ 
                cout<<k+a[i]<<endl;
                flag=1;
                break;
            }
        }
        if(flag==0) cout<<a[n]+k<<endl;
    }
    return 0;
}



第二题
给你n个工人和m个任务,还有一个利润p,每个任务需要用到x[i]个工人,利润为y[i],问你分配工人后,有多少种方案数可以让利润不小于p,答案取模1e9+7;

T组  1<=T<=100
1<=n<=100
1<=m<=100
1<=x[i]<=100
1<=y[i]<=100

第一行输入T
接下来每组输入m n p
然后输入x[i]
接下来一行输入y[i]
样例
输入:
1
2 5 3
2 2
2 3

输出:
2

一种是只做第二个任务,利润为3,一种是两个任务都做,利润为5

他这题应该所有n总和有个限制,但是题目没说,不然我dp复杂度是1e8了都
要么就是数据弱了。

AC代码:
/*
 * @Author: 7QQQQQQQ
 * @IDE: vscode
 * @Date: 2021-03-08 18:53:38
 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e2+50;
ll dp[N*N][N];   //dp[i][j]获得利益等于i,工人用了j个的方案数
int x[N],y[N];
int main(){
    ios::sync_with_stdio(0);
    int T;cin>>T;
    while(T--){
        int n,m,p;cin>>m>>n>>p;
        dp[0][0]=1;
        int S=0;
        for(int i=1;i<=m;i++){
            cin>>x[i];
        }
        for(int i=1;i<=m;i++){
            cin>>y[i];
            S+=y[i];
        }
        for(int i=1;i<=m;i++){
            for(int j=S;j>=y[i];j--){
                for(int k=n;k>=x[i];k--){
                    dp[j][k] += dp[j-y[i]][k-x[i]];
                    dp[j][k]%=mod;
                }
            }
        }
        ll ans=0;
        for(int i=p;i<=S;i++){
            for(int j=1;j<=n;j++) {
                ans+=dp[i][j];
                ans%=mod;
            }
        }
        for(int i=1;i<=S;i++){
            for(int j=1;j<=n;j++){
                dp[i][j]=0;
            }
        }
        cout<<ans%mod<<"\n";
    }
    return 0;
}

update:
第二题应该是数据水了
听NB群友说,我们可以注意到p<=100,所以已经大于100的利润我们可以看成一个整体去计算即可,而不需要逐一枚举。
所以复杂度是T * n * m *100 =1e8





#笔试题目##阿里巴巴#
全部评论
求加群
点赞 回复 分享
发布于 2021-03-21 23:45
为什么第一题直接把输入的数据存到hashmap中然后从输出的第一个数开始有序遍历这样只能过25,这是为啥
点赞 回复 分享
发布于 2021-03-08 23:22
您好,请问不用读写文件吗?
点赞 回复 分享
发布于 2021-03-08 23:08
膜了,想问一下,时间是7点前15分钟就进入,7点正式开始,8点就截止了是吗?
点赞 回复 分享
发布于 2021-03-08 21:30
大佬帮看看代码,第一题感觉和你的思路差不多,只过了60% t = int(input()) for i in range(t):     n, k = map(int, input().split())     alist = [int(q) for q in input().split()]     #print(alist)     alist.sort()     cnt = 0     flag = 0     res = 0     for w in range(n-1):         if cnt >= k:             print(res-(cnt-k))             flag = 1             break         pre = alist[w]         aft = alist[w+1]         cur = aft-pre-1         cnt += cur         res = pre + cur     if flag == 0:         print(alist[n-1]+k-cnt)
点赞 回复 分享
发布于 2021-03-08 20:48
第二题你那个不用开1e4,可以把超过的全当100,这样你那个S直接可以从100枚举了。
点赞 回复 分享
发布于 2021-03-08 20:43
膜大佬
点赞 回复 分享
发布于 2021-03-08 20:35

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
10
33
分享

创作者周榜

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