5.16美团笔试

#笔试##面试之前应该如何准备?#

一、选择题:略。

二、编程题:
(1) 给定一个数字n(n <= 5e6),求有多少美丽数x <= n, 美丽数x的定义是:是一个正整数且存在一个质数p,使得x % p = 0且x <= p * p。

先用线性筛筛一遍素数,然后枚举每一个质数的倍数(时间复杂度是一个调和级数,约为log),时间复杂度O(N + n loglog(n))。

(2) 给定一个长度为n的且只有小写字母构成的字符串s,可以选择两个不同的索引x, y,  交换s[x] 和 s[y],问恰好一次操作使得s[0] <= s[1] <= ... <= s[n - 1]可不可以,可以输出YES,  不可以输出NO,多组测试数据,长度和不超过1e5。

预处理每个位置往前最多有序多少位,记为dp[i], 举个例子,如果dp[i]=2, s[i]>=s[i-1]。
预处理前缀的索引最小值mx[26],每次记录每种字母s[i]-'a'的索引最小值。
枚举s,对于每个位置,枚举s[i]-'a'+1到25中的最小值,为什么是最左边的值,因为如果交换的不是最左边,那么左边还存在比它大的,肯定不行,因为操作恰好一次,最优方案一定是最左边的那个比它大的字符。假设找到了这个索引是l, 那么就是l和i交换,
判断:dp[l - 1] == l;dp[r-1] >= len(l+1,r-1);dp[n]>=len(r+1,n),此时交换完是i, l, 要满足s[i]>=s[l-1], s[i]<=s[l+1], s[l]>=s[i-1], s[l]<=s[i+1]。
注意一下边界,如果一开始就是有序的,看有没有相等的,有就是YES。

全部评论
大佬带带我
点赞 回复 分享
发布于 06-06 01:44 广东
老哥是一个小时吗?就两道编程题吗?
点赞 回复 分享
发布于 05-17 17:09 四川

相关推荐

05-23 15:16
已编辑
门头沟学院 Java
1,缓存架构?答:讲了一下redis在项目中的具体实现注:其实面试官想问的是多层架构2,redsi缓存击穿,穿透,雪崩怎么解决?答:击穿可以通过设置热key永不过期穿透可以使用缓存空值和布隆过滤器来解决雪崩可以通过给键设置基础时间值+随机时间值来解决注:缓存击穿还可以还通过互斥锁进行解决(性能较低)关于雪崩上面只说了大量key过期的问题&nbsp;没有提到redis宕机解决方法:(1)设置多层架构 (2)建立redis主从或集群(3)提前演练redis宕机&nbsp;从而设计解决方法3,大量不存在的用户同时登录时会给数据库造成压力,怎么解决?答:使用redis缓存空值注:缓存空值不能有效解决这类缓存穿透问题这里要使用布隆过滤器进行拦截&nbsp;更加有效在实际业务开发中最好俩者结合使用4,jwt?答:说了一下jwt的生成和解析以及结构5,讲讲乐观锁和悲观锁答:讲了一遍sychronized的底层实现从无锁-&gt;偏向锁-&gt;轻量级锁-&gt;重量级锁这里轻量级锁就是乐观锁&nbsp;重量级锁就是悲观锁6,乐观锁和悲观锁最主要的区别?答:在低并发场景下乐观锁性能好在高并发场景下悲观锁性能好注:乐观锁是认为操作的时候没有线程和我并发操作通过cas判断&nbsp;不会让你的线程挂起&nbsp;可能会不断自旋去尝试获取锁悲观锁是认为有线程和我并发操作&nbsp;拿不到锁线程就会进入阻塞状态直到拿到锁的线程释放锁后唤醒该线程7,sychronized和reentrantlock有什么区别?答:sychronized由jvm释放锁&nbsp;reentrantlock手动释放sychronized不可重入&nbsp;reentrantlock可重入(避免死锁)注:这里答错了sychronized可重入 他们的主要区别在于sychronized不支持公平锁,不支持超时不可中断,不支持多条件 sychronized是java内置的关键字&nbsp;reentrantlock是由juc类库所提供的8,aop怎么理解?这里答的太乱了不清楚注:把那些非核心功能抽取出来封装成一个切面去掉冗余代码通过动态代理的方式&nbsp;将需要注入切面的对象进行代理在进行调用的时候直接将公共逻辑注入 侵入性较低1,缓存架构?答:讲了一下redis在项目中的具体实现注:其实面试官想问的是多层架构2,redsi缓存击穿,穿透,雪崩怎么解决?答:击穿可以通过设置热key永不过期穿透可以使用缓存空值和布隆过滤器来解决雪崩可以通过给键设置基础时间值+随机时间值来解决注:缓存击穿还可以还通过互斥锁进行解决(性能较低)关于雪崩上面只说了大量key过期的问题&nbsp;没有提到redis宕机解决方法:(1)设置多层架构 (2)建立redis主从或集群(3)提前演练redis宕机&nbsp;从而设计解决方法3,大量不存在的用户同时登录时会给数据库造成压力,怎么解决?答:使用redis缓存空值注:缓存空值不能有效解决这类缓存穿透问题这里要使用布隆过滤器进行拦截&nbsp;更加有效在实际业务开发中最好俩者结合使用4,jwt?答:说了一下jwt的生成和解析以及结构5,讲讲乐观锁和悲观锁答:讲了一遍sychronized的底层实现从无锁-&gt;偏向锁-&gt;轻量级锁-&gt;重量级锁这里轻量级锁就是乐观锁&nbsp;重量级锁就是悲观锁6,乐观锁和悲观锁最主要的区别?答:在低并发场景下乐观锁性能好在高并发场景下悲观锁性能好注:乐观锁是认为操作的时候没有线程和我并发操作通过cas判断&nbsp;不会让你的线程挂起&nbsp;可能会不断自旋去尝试获取锁悲观锁是认为有线程和我并发操作&nbsp;拿不到锁线程就会进入阻塞状态直到拿到锁的线程释放锁后唤醒该线程7,sychronized和reentrantlock有什么区别?答:sychronized由jvm释放锁&nbsp;reentrantlock手动释放sychronized不可重入&nbsp;reentrantlock可重入(避免死锁)注:这里答错了sychronized可重入 他们的主要区别在于sychronized不支持公平锁,不支持超时不可中断,不支持多条件 sychronized是java内置的关键字&nbsp;reentrantlock是由juc类库所提供的8,aop怎么理解?这里答的太乱了不清楚注:把那些非核心功能抽取出来封装成一个切面去掉冗余代码通过动态代理的方式&nbsp;将需要注入切面的对象进行代理在进行调用的时候直接将公共逻辑注入&nbsp;侵入性较低不想写了&nbsp;直接把问题都扔出来吧&nbsp;java线程池的七个参数?1.&nbsp;Java线程池,5核⼼、10最⼤、10队列,第6个任务来了是什么状态?任务扔到⼯作队列中2.&nbsp;如果在第6个任务过来的时候,5个核⼼线程都已经空闲了呢?⼀样扔到队列(线程池只关注数量)3.&nbsp;第16个任务来了怎么处理?创建⾮核⼼线程去处理第16个任务4.&nbsp;第16个任务来了的时候,要是有核⼼线程空闲了呢?如果这个空闲的线程,将⼯作队列中的10个任务,取⾛了⼀个,变为了9个,那任务扔队列。如果空闲的线程还没来得及取⾛任务,投递时,队列⻓度依然为10,那还是创建⾮核⼼。5.&nbsp;队列满了以后执⾏队列的任务是从队列头&nbsp;or&nbsp;队尾取?⼀般咱们的阻塞队列都是FIFO的,所以先进先出,从头取。6.&nbsp;核⼼线程和⾮核⼼线程执⾏结束后,谁先执⾏队列⾥的任务?谁空闲了,并且去等待任务,谁先去执⾏队列⾥的任务。7.为什么⾮核⼼优先执⾏投递的任务?8.核⼼线程与⾮核⼼线程有什么区别?9.MySQL中如何实现数据的读⼀致性?10.&nbsp;MySQL的InnoDB引擎是如何通过⽇志实现事务的?11.&nbsp;MySQL崩溃恢复为什么不⽤binLog?12.Redis的事务了解吗?13.Redis&nbsp;的持久化机制?总结:对底层的理解还是不够深入&nbsp;之前没有了解过redis事务&nbsp;有的时候答非所问容易跑题
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

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