字节面试题-小于N的最大数字

这篇具有很好参考价值的文章主要介绍了字节面试题-小于N的最大数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该题目在网上目前的答案很多,但是要么很长难以理解,要么答案根本就不对。最近看到了这位博主的博文:字节面试题:给定数字n,数组arr={1,3,5,2},求arr中的数字能组成小于n的最大整数_斯文流氓骚刚的博客-CSDN博客

深受启发,但原文仍有瑕疵,最终的答案可以等于N,而且有不必要的搜索。本文作了修改,使用python语言重写。

题目要求:给定一个数组arr=[2,3,4,5],N=2345,求使用arr中的数字,组成一个不大于N的最大的数字。arr中的数字可以多次使用。

思路:

首先将arr数组排序,之后使用深搜+贪心的思想,从第一位开始,尽量使用与对应位置相等的数字。如果有任意一位没有使用相等的数字,那在后面的所有位中都直接使用最大的数字即可。

递归终止条件:

        1.已经考虑完了所有的位,那么应该返回0

        2.在之前选择的基础上,此位置没有满足条件的选择,应当返回-1

边界情况:

        1.如果前面都是用了相等的数字,那么最后一位选用的数字必须小于对应的数字。

        2.如果在找第一位时,就发现都不相等,那不要立刻返回-1,而是应该放弃第一位,将后面的位都选择最大值。

代码如下:

from typing import List
"""
arr:可使用数字的数组
nums:目标数字对应的整数数组
preEq:之前是否每一位都使用了相等的值
index:当前考虑到了第几位,从0开始
函数语义:返回第index位后可组成的最大的数字,包括第index位
"""
def dfs(arr, nums,  preEq,  index):
    #如果考虑完了最后一位,那么能组成的最大值为0
    if index==len(nums):
        return 0

    if preEq:#如果前面使用的都是相等的数字
        for i in range(len(arr)-1,-1,-1):#从最大的往下排
            if index==len(nums)-1:
                if arr[i]<nums[index]:#在前面使用的都是相同的数字,那么最后一位的数字不能是相等的,这个看具体面试官的要求
                    temp = dfs(arr, nums, arr[i] == nums[index], index + 1)
                    if temp==-1:#向下深搜发现没有满足要求的值,则选用更小的数字
                        continue
                    # 向下深搜发现了满足要求的值,那说明我们找到结果了,把这一层的结果加进去,之后层层返回即可
                    return arr[i] * pow(10,len(nums)-index-1) + temp
            else:
                if arr[i]<=nums[index]:#非最后一位的数字是可以相等的
                    temp = dfs(arr, nums, arr[i] == nums[index], index + 1)
                    if temp == -1:
                        continue
                    return arr[i] * pow(10, len(nums) - index - 1) + temp
        #如果上面的for循环走完都没有return的话,那就说明这一层所有的数字都不满足要求
        #如果是第一个数字都无法满足的话,那就直接从第二位开始,将preEq置为False递归
        if index==0:
            return dfs(arr, nums, False, index + 1)
        # 如果上面的for循环走完都没有return的话,而且也不是第一位,那就返回-1,回退递归
        return -1
    else:
        #如果前面不是都选用了相等的数字,那就直接每次挑最大的数字就行了。
        return arr[len(arr)-1] * pow(10, len(nums) - index - 1) + dfs(arr, nums, False, index + 1)


def find(N,arr: List[int]) -> int:
    arr.sort()
    nums = [int(i) for i in str(N)]
    #递归的初始条件,preEq=True,index=0
    return dfs(arr,nums,True,0)



arrInputList = [
[2,3,4,5],
[2,3,4,5],
[2,3,4,5],
[2,3,4,5]
]
NList =   [1234,2234,2231,2134]
ansList = [555, 2233,2225,555]
for i in range(len(NList)):
    ans = find(NList[i], arrInputList[i])
    print(NList[i], arrInputList[i],ans)

以下内容无意义,因为CSDN说文章质量低。

沈腾,1979年10月23日出生于黑龙江省齐齐哈尔市,中国内地男演员、影视导演、编剧,开心麻花舞台剧签约艺人,毕业于解放军艺术学院戏剧表演系。

2003年出演开心麻花第一部舞台剧《想吃麻花现给你拧》 [1]  。2004年参演电视剧《青春正步走》。2006年出演话剧《我在天堂等你》。2012年首次登上央视春晚,并在春晚上表演小品《今天的幸福》,凭借小品中饰演的“郝建”获得广泛关注 [2]  。2013年再次登上央视春晚,并表演小品《今天的幸福2》;同年获得第2届中国大学生微电影节最佳男主角奖 [17]  ;4月25日获得第四届现代戏剧谷2013壹戏剧大赏年度新锐男演员奖 [3-4]  。2014年第三次登上央视春晚,表演小品《扶不扶》 [5]  ;4月参与电视剧《你是我的眼》的拍摄,在剧中饰演男主角张三斤 [6]  。2015年第四次登上央视春晚表演小品《投其所好》。2015年参加《欢乐喜剧人》第一季,并获得冠军 [7]  ;9月30日与马丽领衔主演的喜剧电影《夏洛特烦恼》上映 [312]  。

2016年特别出演的电影《王牌逗王牌》公映 [313]  。2017年在央视春晚上表演小品《一个女婿半个儿》 [9]  ;同年参演开心麻花第三部电影《羞羞的铁拳》 [10]  。2018年特别出演动作电影《龙虾刑警》 [314]  ;7月27日主演的电影《西虹市首富》全国公映 [11]  。2019年大年初一主演的电影《飞驰人生》 [12]  、《疯狂的外星人》同步上映 [13]  。2020年主演爆笑喜剧《创客联盟》;8月27日名列《2020福布斯中国名人榜》第28位 [14-15]  ;同年主演电影《独行月球》 [315]  。2021年大年初一主演的电影《你好,李焕英》上映 [316]  ;同年主演电影《光天化日》 [317]  。文章来源地址https://www.toymoban.com/news/detail-627510.html

到了这里,关于字节面试题-小于N的最大数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 求最大子序列和(贪心算法)

    #include \\\"iostream\\\" #include \\\"vector\\\" using namespace std; class Solution { // 得到一个最大的负数 int isAllLow(vectorint nums){ int max=nums[0]; for (int i = 1; i nums.size(); ++i) { if(maxnums[i]){ max=nums[i]; } } return max; } public: // 求最大子序列 int maxSubArray(vectorint nums) { int sum=0; int maxsum=this-isAllLow(nums); // 如果是一个

    2024年02月07日
    浏览(43)
  • 贪心算法求数组中能组成三角形的最大周长

    题目:三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形,返回`0。 分析: 对数组排序,再从大到小选择三个数, 再判断是否能构成三角形,可以直接返回三数之

    2024年02月12日
    浏览(47)
  • K 次取反后最大化的数组和【贪心算法】

    1005 . K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 关于 nums = IntStream.of(nums

    2024年02月11日
    浏览(47)
  • DAY36:贪心算法(三)最大子数组和+买卖股票最佳时机

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 10^5 -10^4 = nums[i] = 10^4 枚举思路 本题的暴力解法就是两个for循环,一个for循环遍

    2024年02月12日
    浏览(55)
  • 算法 贪心1 || 455.分发饼干 376. 摆动序列 53. 最大子数组和

    什么是贪心:贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 但是贪心没有套路,做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 很容易想到,把孩子的胃口和饼干大小都排序,都从最小值开始遍历。如果最小的饼干无法满足最

    2023年04月16日
    浏览(50)
  • 算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

    Hello,大家好,我是星恒 呜呜呜,今天给大家带来的又是一道经典的动归难题。 题目:leetcode 410 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k_ 个非空的连续子数组。 设计一个算法使得这 k _个子数组各自和的最大值最小。 示例: 示例 1: 示例 2: 示例

    2024年01月22日
    浏览(47)
  • 贪心算法|1005.K次取反后最大化的数组和

    力扣题目链接 有没有不理解的语法知识呢? sort函数中的比较函数cmp(),即 void sort( iterator start, iterator end, StrictWeakOrdering cmp ); sort函数头文件为: #include algorithm 其中,cmp函数可以自己编写,自己决定逻辑,包括cmp的命名也是自己决定的。 示例如下:  代码随想录 (programmerc

    2024年04月09日
    浏览(69)
  • LeetCode-1005-K次取反后最大化的数组和-贪心算法

    题目描述: 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 LeetCode-1005题目链接 思路见注释~ 代码实现

    2024年02月10日
    浏览(34)
  • DAY40:贪心算法(九)单调递增的数字(贪心的思路)

    本题暴力解法也需要看一下,虽然暴力解法超时了,但是这种思路是一种很基础的思路,需要了解 数字是没有办法直接采用下标遍历的 ,如果 要for循环遍历每个位置的数字,需要把数字转成字符串string 当且仅当每个相邻位数上的数字 x 和 y 满足 x = y 时,我们称这个整数是

    2024年02月12日
    浏览(50)
  • 算法训练day31贪心算法理论基础Leetcode455分发饼干376摆动序列53最大子序和

    文章链接 代码随想录 (programmercarl.com) 说实话贪心算法并没有固定的套路 。 最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧 。 面试中基本不会让面试者现场证明贪心的合理性,代码写出来跑过测试用例即可,或者自己能自圆其说理由就行了 。 刷题或者面

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包