记一道字节面试题:小于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

相关推荐

03-18 15:43
南开大学 Java
继续多发面经继续攒人品,可是老乡这面经可凉啊!我是从来不怕发面经的,再来一面!--------------------------------------------------------1.个人的基本介绍(2min)------------------------------------------项目介绍与聊天(25min)---------------------------------------------------2.你的项目的难点在于什么地方,在aicoding的全栈开发的流程是怎么样的呢,你如何解决这些问题的?3.用的什么模型,不同模型有什么样的体感的区别?Cli和IDE的vibe&nbsp;coding的区别?4.langgraph有哪些组件,以及它能实现的功能,这个框架的优点在哪里?5.请给我介绍一下deepagents的设计的框架,也可以在白板上面画一下他的大概架构图,作为一个系统设计。那最近的agent&nbsp;swarm有了解么,是什么呢?6.如何做评估的体系呢,怎么评判你的效果,或者bad&nbsp;case?那最后项目的效果如何?7.场景题:如果要你运用skills运用到你的项目当中,你需要怎么设计,请给我设计一下?你说抽象通用技能和特定技能赋予,能详细展开说说么?8.PE你要如何分层设计会减少问题呢9.有做过本地部署模型训练么,强化学习和监督微调了解过么?本地部署用的多大的模型,你的GPU指标参数是什么,如何做好推理优化和并行加速有了解过么?显存给我讲讲,cuda的架构以及模型训练的同步方式,以及如何可以进行高效的通信?(怎么越扯越偏了,只能用课上的知识来回答了)--------------------------------------------------算法题(12min)---------------------------------------------------找出小于n的最大数(老演员了)-------------------------------------反问--(13min)--------------------------部门业务,面试官应该是leader,对我的问题进行了详细的业务和技术的解答,也介绍了他们的部门的业务。也是很能说会道啊。然后说进来干的活强度不小,和正职也是一样的,需要快速迭代和持续学习。---------------------总之就是三面考察的就是项目的延申和知识点广度了,以及前沿的知识的学习,也幸好当年为了准备Google和亚麻(虽然都挂了)的面试的期间看了一下白板设计,也是很好的把图画出来了。然后也是要多学多了解一些前沿知识吧,同时工程化思维在agent的设计当中也是不可或缺的一部分。后续:晚上约hr面。
查看10道真题和解析
点赞 评论 收藏
分享
评论
7
72
分享

创作者周榜

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