记一道字节面试题:小于n的最大数

nums = [5,6,8,7]
target = 500
nums.sort()
target = str(target)
def search(nums, target):
    low, high = 0, len(nums) - 1 
    while low < high:
        mid = low + (high - low + 1) // 2
        if nums[mid] <= target:
            low = mid
        else:
            high = mid - 1
    return nums[low] if nums[low] <= target else -1
def getMaxNumbers(nums, target):
    res, ans, flag = [], 0, False
    for i in range(len(target)):
        if flag:
            res.append(nums[-1])
            continue
        subtarget = target[i]
        temp = search(nums, int(subtarget))
        if temp == -1:
            if i == 0:
                if len(target) == 1:
                    return 0
                else:
                    return str(nums[-1]) * (len(target) - 1)
            else:
                index = i - 1
                while temp == -1 and index >= 0:
                    temp = search(nums, int(target[index]) - 1)
                    index -= 1
                if temp == -1:
                    return str(nums[-1]) * (len(target) - 1)
                res[index + 1] = temp
                for j in range(index + 2, i):
                    res[j] = nums[-1]
                res.append(nums[-1])
                flag = True
        else:
            if temp == int(subtarget):
                res.append(temp)
            else:
                res.append(temp)
                flag = True
    for i in range(len(res)):
        ans = ans * 10 + res[i]
    return ans
print(getMaxNumbers(nums, target))

问题描述:给一个数组nums=[5,4,8,2],给一个n=5416, 让你从nums中选出一些元素,使得组成的数字是小于n的最大数,比如这个例子应该返回5288,当时没想出来,让面试官换了一道题,事后顺着一些大佬的思路写了下,感觉贪心加二分这个思路比较接近正确答案,有没有人看下这个方法行不行
 

#字节跳动#
全部评论
void maxNumber(const vector<int> &v, int num) { vector<int> arr, ans; int minChoose=10, maxChoose=0; bool exist[10]; for(int x:v) { exist[x]= true; minChoose = min(minChoose, x); //可选择的最小值 maxChoose = max(maxChoose, x); //可选择的最大值 } while(num) //将num每一位存到数组 { arr.push_back(num%10); num /= 10; } reverse(arr.begin(), arr.end()); //答案应尽可能和num位数相同,若位数相同无解,则答案减少一位且每位取最大值,如100 {2,3,4}的答案为44 for(int i=0;i<arr.size>= minChoose ? arr[i] : arr[i] - 1); while (j >= 0 && !exist[j]) j--; if(j<0) //同位数无解,退而求次降低解的位数 { ans.clear(); for (int k = 0; k < arr.size() - 1; ++k) ans.push_back(maxChoose); break; } else if(j!=arr[i]) //当前位取了小于原数同位的值,则解确定,后面每一位都可以取最大值 { ans.push_back(j); while (ans.size()</arr.size></int></int>
1 回复 分享
发布于 2022-05-03 16:16
实际上 数只有十个 那我们贪心就好了 我们首先匹配这个数 如果每一位都在这个数组中存在 就修改最小的一位 如果不 就把最高的不能匹配的位之后变成数组中最大值 这一位找一个小的数代替
5 回复 分享
发布于 2022-05-02 00:28
代码考虑不周全,好几次跑出来的值和taget相等
1 回复 分享
发布于 2022-05-26 00:05
我也是贪心➕二分的解法,前两天我朋友问我的,一会我贴上来,不保证没有漏洞,但是目前的用例是都过了
1 回复 分享
发布于 2022-05-02 10:28
这个代码有点问题呀,没有考虑到最后如果全部都是匹配成等于的情况,例如nums = [2], target = 22的情况。
点赞 回复 分享
发布于 2024-10-13 14:54 福建
数位dp?
点赞 回复 分享
发布于 2024-08-28 23:18 浙江
有人知道这道题的oj链接吗,想测试下
点赞 回复 分享
发布于 2022-08-08 21:54
你这个5416咋输出888,我尝试了一下
点赞 回复 分享
发布于 2022-07-23 17:12
题目规模不大,2**31 也就 10 个数字,dfs+剪枝方法 虽然不是最优不过也可以过给的用例
点赞 回复 分享
发布于 2022-05-25 17:00
今天我也问的这道题,和他说的是贪心+二分,然后面试官说应该就是最优的
点赞 回复 分享
发布于 2022-05-06 15:58
重新编辑了下,有几个边界情况考虑错了
点赞 回复 分享
发布于 2022-05-02 16:34
我擦,长的
点赞 回复 分享
发布于 2022-05-02 00:15

相关推荐

GGGGGGG,难死我得了,继续沉淀pulsar是什么模式的?怎么实现高性能的pulsar怎么保证消息不丢失的?消息积压怎么处理?怎么保证能榨干pulsar的性能?怎么保证消费的平衡?怎么通过并发去压榨pulsar的性能?拒绝策略怎么定义的,参数怎么去设置的?你知道并发和并行的区别吗?java中哪些工具是并发,哪些是并行的呢?有没有哪种是非阻塞的保证线程安全的?kafka是什么模式?了解事件驱动吗?不清楚是不是这个问题了io多路复用有了解吗?怎么实现高性能的?如果调用第三方网络超时了应该怎么处理?请求之后超时了你怎么确定你这次请求有没有改成功呢?重复请求你又怎么去保证数据的幂等性,防止幂等问题?有一个协议可以解决这个问题,你知道是什么协议吗?(TCP)当时脑子卡住了,没想起来,我是傻逼如果请求服务端出现大量的close_wait是什么原因?linux什么命令可以排查大量close_wait是什么导致的netty有了解过吗?不了解数据库查询很慢,你对索引分片等都已经做了优化,但还是很慢,怎么排查?数据库连接有调优过吗?redis分布式锁怎么实现的原理是什么?看门狗机制是什么?看门狗什么时候会失效?Redisession&nbsp;底层怎么实现的分布式锁?xxl-job和???定时有什么区别,了解底层调度原理吗?时间轮算法有了解吗?内存溢出怎么排查?第三方包的升级你知道升级了什么吗?怎么优化这个问题的?堆外内存溢出怎么排查是什么问题呢?ThreadLocal没有remove为什么会产生内存泄漏sharding&nbsp;的分库分表是出于什么原因要分库分表?分片键是什么?如果一个公司占用了90%的资源,那分库分表还有意义吗?怎么解决?没有反问&nbsp;G
点赞 评论 收藏
分享
01-25 21:56
已编辑
门头沟学院 Java
1如何理解开闭原则?2.为什么我们要遵循这个原则3.异步并发这里怎么做的4线程池这些参数你是怎么来进行一个合理设置的?5.某一个线程池突然大量线程被占用了,导致整个链路变慢了,这个时候你有哪一些的方式去处理它?6.拆分微服务的依据是什么呢?7如果遇到边界不清晰的情况如何决策8.DDD&nbsp;相关的你有了解过吗?9.某一个服务它频繁的要去调用另一个另外一个服务,这个时候你会如何做一个优化?10.选择顺序消费?这个顺序消费它有什么好处?以及它有什么坏处吗?11.定时任务补偿方案12消息积压大概是有多大的数据量啊?消费速率大概是多大?13.RabbitMQ&nbsp;和&nbsp;RocketMQ&nbsp;选择的决策消息的丢失和重复,你是来怎么保证两端的数据一致的14.MQ&nbsp;的集群它这个时候有了一些故障,降级的方案?15.MQ&nbsp;序列化排查过程当中用了怎样的排查的方法?用了哪些工具16.针对这个问题如何去避免它再次发生?17.MQ&nbsp;里面的消息格式需要升级,比如说需要新增了一个字段,那如何来保证一个平滑的升级?18.分享一下你做慢查询排查的一个案例?19.为什么走索引它就会更快呢?20.3&nbsp;层的&nbsp;b&nbsp;加树大概可以存多少个数据?21.如何解决深分页的问题?22.如何来识别长事务?(答的不好)23.为什么事务提交后执行这些操作?24.使用&nbsp;Redis&nbsp;的分布式锁,而不是使用数据库的锁?25.什么场景下更适合用数据库的锁?发优惠卷,redis&nbsp;分布式锁都扛不住&nbsp;qps&nbsp;了怎么优化?26.Mysql&nbsp;迁到了一个达梦的数据库,怎么做的?27.迁移过程当中你遇到的最大的挑战是什么?28.在这个过程当中你起到了怎样的一个作用?29.有两个实习生来做这样一个事情,你觉得你和他做的会有什么不一样?30.最近有在学什么东西吗?#&nbsp;二面怎么获取的学习&nbsp;AI&nbsp;的一些途径有哪些优质的博主行业内的一些趋势有没有去关注?MCP&nbsp;主要解决什么问题?Agent&nbsp;有了解吗?程序员在&nbsp;AI&nbsp;时代应该锻炼什么样的技能?单体和微服务的适用场景微服务的拆分的依据是什么呀?拆这么细的有没有带来什么问题?级联故障有没有考虑过?比如说你现在,比如拆这么多细节,如果有一个下游系统故障了,那会不会导致整个系统都会面临瘫痪?微服务的一些降级跟熔断的一些手段?项目消息积压的解决方案?改用&nbsp;ES&nbsp;搜索优化的背景是什么?ES&nbsp;的一次搜索的一个流程吗?还有没有可能其他的字段也会导致&nbsp;RPC&nbsp;序列化失败?能在&nbsp;CICD&nbsp;阶段避免这个问题?单点登录有哪几种实现方式吗?oauth2.0&nbsp;和&nbsp;1.0&nbsp;的升级员工离职了数据应该怎么清除啊?TOKEN&nbsp;的话是怎么存储的呢?是存储在浏览器端,还是存储在服务器?浏览器是怎么定位到要取这个&nbsp;Redis&nbsp;数据?JWT&nbsp;TOKEN&nbsp;它的设计组成有哪几种?有哪些组成部分?这个&nbsp;TOKEN&nbsp;的话,它怎么续期的?具体这个续期的逻辑怎么做呢?refresh&nbsp;TOKEN&nbsp;是用来做什么的?达梦和&nbsp;mysql&nbsp;迁移的时候,哪些地方做的兼容?停服务停机去做迁移吗?还是说线上是可以正常运行?那迁移到底有没有完成,以及数据到底是不是没有问题的?这个应该怎么验证?Rabbitmq&nbsp;跟&nbsp;Rocketmq&nbsp;如何选?Dubbo&nbsp;框架有去系统性的看过吗?比如说它的一些底层原理。threadlocal&nbsp;内存泄露remove&nbsp;方法可以放在哪些位置自旋锁来解决&nbsp;TOKEN&nbsp;重复刷新自旋锁的一个实现逻辑如何通过&nbsp;explain&nbsp;制定&nbsp;sql&nbsp;的优化策略大事务问题transactionsynchronizemanager&nbsp;起到了什么作用保证消息不丢失不重复消费分布式锁底层实现锁失效或者说死锁的问题平时有接触过&nbsp;DDD设计实现一个&nbsp;RPC&nbsp;的框架接触过&nbsp;AI&nbsp;编程的一些&nbsp;IDE&nbsp;吗AI&nbsp;怎么提升你的一个开发效率?对于模型的一个输出的话是怎么样跟你一个推荐系统做结合的?
点赞 评论 收藏
分享
评论
7
71
分享

创作者周榜

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