携程算法笔试
选择题10道,一题2分
编程题4道,一题20分
第一题是求n!的个位数,很明显n>=5之后都是0了
第二题是给定n,m<=1e18,要求一个最大的k,使得n可以被拆成k个素数之和,且奇素数的个数是m的倍数,考虑如果用大于等于7的素数,永远可以拆成一堆2+一个3,依然保持奇素数个数不变,所以导出结论:最优分解中一定是x个2和y*m个3这样的结构,那么考虑x*2+y*m*3=n,得到x=(n-3*m*y)/2,目标x+m*y就变成了(n-m*y)/2,其中x>=0,y>0,所有数都整数,所以判断答案是(n-m)/2还是(n-2m)/2还是无解即可
第三题必须python,要求用scikit-learn处理一个训练集/测试集,做无监督聚类,完全不会,根本没用过
第四题给定一个长度为n(<=1e5)的数组a,一个正整数q(<=1e5),接着是q个询问x(<=5e5),每次询问要求输出sum(a[i]) for i&x==i,考虑枚举子集预处理答案,首先求maxbit使得2^maxbit大于n,枚举子集处理所有2^maxbit状态,一定覆盖所有的i,然后对于询问x,其求和等价于x与2^maxbit–1按位与之后再求和,而这个和是预处理过的,直接输出即可,枚举子集的复杂度是maxbit*2^maxbit,也就是nlogn,不会超时
#携程# #携程笔试#
编程题4道,一题20分
第一题是求n!的个位数,很明显n>=5之后都是0了
第二题是给定n,m<=1e18,要求一个最大的k,使得n可以被拆成k个素数之和,且奇素数的个数是m的倍数,考虑如果用大于等于7的素数,永远可以拆成一堆2+一个3,依然保持奇素数个数不变,所以导出结论:最优分解中一定是x个2和y*m个3这样的结构,那么考虑x*2+y*m*3=n,得到x=(n-3*m*y)/2,目标x+m*y就变成了(n-m*y)/2,其中x>=0,y>0,所有数都整数,所以判断答案是(n-m)/2还是(n-2m)/2还是无解即可
第三题必须python,要求用scikit-learn处理一个训练集/测试集,做无监督聚类,完全不会,根本没用过
第四题给定一个长度为n(<=1e5)的数组a,一个正整数q(<=1e5),接着是q个询问x(<=5e5),每次询问要求输出sum(a[i]) for i&x==i,考虑枚举子集预处理答案,首先求maxbit使得2^maxbit大于n,枚举子集处理所有2^maxbit状态,一定覆盖所有的i,然后对于询问x,其求和等价于x与2^maxbit–1按位与之后再求和,而这个和是预处理过的,直接输出即可,枚举子集的复杂度是maxbit*2^maxbit,也就是nlogn,不会超时
#携程# #携程笔试#
全部评论
选择题?我落下题了吗!!
开放面是4道编程,1、2、4一样,3是一道前缀和的题
相关推荐
点赞 评论 收藏
分享
03-11 22:40
广东工业大学 Java 点赞 评论 收藏
分享
