最新华为OD机试真题——(E卷,200分)- 编码能力提升计划(python)

题目描述

为了提升软件编码能力,小王制定了刷题计划,他选了题库中的 ( n ) 道题,编号从 0 到 ( n-1 ),并计划在 ( m ) 天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一题)。

在小王的刷题计划中,小王需要用 ( time[i] ) 的时间完成编号 ( i ) 的题目。

此外,小王还可以查看答案,可以省去该题的做题时间。为了真正达到刷题效果,小王每天最多直接看一次答案。

我们定义 ( m ) 天中做题时间最多的一天耗时为 ( T ) (直接看答案的题目不计入做题总时间)。

请你帮小王求出最小的 ( T ) 是多少。

输入描述

  1. 第一行输入题目时间,用逗号分隔,表示每道题的时间 ( time )。
  2. 第二行输入一个整数 ( m ),表示几天内完成所有题目 ( ( 1 \leq m \leq 180 ) )。

输出描述

  • 输出一个整数,表示最小的耗时 ( T )。

用例示例

示例 1

输入:

999,999,999
4

输出:

0

说明:
在前三天中,小王每天都直接看答案,这样他可以在三天内完成所有的题目并不花任何时间。


示例 2

输入:

1,2,2,3,5,4,6,7,8
5

输出:

4

说明:
第一天完成前 3 题,第 3 题看答案;第二天完成第 4 题和第 5 题,第 5 题看答案;第三天完成第 6 和第 7 题,第 7 题看答案;第四天完成第 8 题,直接看答案;第五天看答案。

python源码

# 输入获取
time_list = list(map(int, input().split(",")))  # 将输入的时间字符串转换为整数列表
days = int(input())  # 读取天数

def is_feasible(max_time):
    # 今天总耗时
    total_time = 0
    # 今天耗时最多的题目的耗时
    highest_time = 0
    # 是否可以申请帮助
    can_request_help = True

    # 第几天
    current_day = 1

    index = 0
    while index < len(time_list):
        total_time += time_list[index]
        highest_time = max(highest_time, time_list[index])

        if total_time > max_time:
            # 如果做完当前题目,累计耗时超过了设定的max_time
            if can_request_help:
                # 如果可以申请帮助,那么就看耗时最长的题目的答案
                total_time -= highest_time
                # 使用了申请帮助的机会
                can_request_help = False
                # 继续做下一道题
                index += 1
            else:
                # 如果不能申请帮助,则今天无法完成当前题目,只能放到明天做
                # 切换到第二天
                current_day += 1
                # 重置今天的总耗时,最高耗时,以及申请帮助的机会
                total_time = 0
                highest_time = 0
                can_request_help = True
        else:
            # 如果做完当前题目,累计耗时没有超过设定的max_time,则继续做下一道题
            index += 1
            
    return current_day <= days  # 判断是否在规定的天数内完成所有题目


# 算法入口
def calculate_min_time():
    # T的初始取值范围
    lower_bound = 0
    upper_bound = sum(time_list) - max(time_list)  # 总耗时减去最高耗时的题目

    # 二分查找
    while lower_bound <= upper_bound:
        # 取中间值尝试
        middle_value = (lower_bound + upper_bound) >> 1

        if is_feasible(middle_value):
            # 如果 feasible,尝试减少时间
            upper_bound = middle_value - 1
        else:
            # 否则增加时间限制
            lower_bound = middle_value + 1

    return lower_bound  # 返回找到的最小耗时

# 算法调用
print(calculate_min_time())  # 输出最小耗时

关于华为OD

在这里插入图片描述

华为OD机考笔试的难度逐年提升,对于算法基础薄弱或工作后较少接触算法的候选人来说,通过率较低,因此全面刷题库是提高通过率的关键。以下是对华为OD职位的一些关键信息整理:

华为OD职位特点:

  1. 校准与可靠性:经过专业校准,确保高可靠性和长期稳定性。
  2. 集成与功耗:传感器通过单线串行接口集成,体积小,功耗低。
  3. 适用场景:适用于多种应用场景,具有4针单排引脚封装,方便连接。
  4. 工作内容:与正式员工一起在华为研究所办公,工作内容基本相同。
  5. 工作时间:弹性工作制,一般一二四需补工时至晚上20:30,三五正常下班,周末双休,月末周六加班双倍工资。
  6. 学历与经验:要求本科及以上学历,理工类专业优先,有编程语言基础和基础算法知识。
  7. 转正要求:工作满一年,通过专业级可信认证,绩效至少拿过一次A,部门有转正指标。

候选人常见关注问题:

  • 外包职位:外包职位并非没有技术学习机会,关键在于个人能力和项目经验。
  • OD转华为正编:需要连续两次绩效A,但并非绝对要求,关键在于个人能力和部门指标。
  • OD稳定性:华为业务基本稳定,外包职位相比互联网和传统外包公司稳定性更高。
  • OD试用期转正:一般要求通过入门级或工作级可信认证,通过率较高。
  • OD转华为正编要求:工作满一年,通过专业级可信认证,绩效至少拿过一次A,部门有转正指标。

职位适合的候选人:

  • 编程水平、项目经验薄弱,希望快速获得核心项目经验的毕业生。
  • 工作经验丰富,希望突破现有薪资待遇和职业发展的专业人士。
  • 有相关基础或经验,希望获得职业转型机会的候选人。
  • 想加入华为但个人能力未达社招正编要求的候选人。

以下是针对华为OD机试E卷的高效备考指南,结合你的需求整理成结构化方案:


一、E卷题型构成分析

  • 题目来源:1道E卷新题 + 2道D/A/B/C卷旧题(新旧比例约1:2)
  • 分数分布:2道100分题(一星难度) + 1道200分题(二星难度)
  • 通过标准:总分150分(非目标院校建议260+安全分,300+对定级/薪资有利)

二、高效刷题策略

1. 优先级排序
  • Step1:优先刷E卷新题(题库持续更新中,关注最新动态)
  • Step2:重点突破D/A/B/C卷高频旧题(占2/3题目,原题概率高)
  • Step3:按算法分类专项练习(参考下文分类题单)
2. 分类刷题法(附高频题型)
算法分类经典题型举例刷题建议
字符串处理字符串反转、KMP算法、正则匹配熟悉API,避免超时
动态规划背包问题、最长递增子序列、编辑距离掌握状态转移方程
DFS/BFS岛屿问题、迷宫路径、拓扑排序模板题反复练习
贪心算法区间调度、分糖果、跳跃游戏验证最优性条件
二叉树遍历、最近公共祖先、序列化递归/迭代双解法
并查集朋友圈问题、连通分量路径压缩优化
滑动窗口最长无重复子串、最小覆盖子串边界条件敏感
3. 刷题技巧
  • 限时训练:100分题40分钟/题,200分题60分钟/题(模拟考试压力)
  • 闭卷编码:先独立完成再看解析,避免“虚假掌握”
  • 查重规避:修改变量名、调整逻辑顺序、添加注释(直接复制易被查重)

三、考试实战技巧

  1. 环境准备

    • 使用Chrome浏览器,关闭无关网页(防弹窗违规)
    • IDE本地编码后粘贴(避免在线编辑器卡顿)
  2. 答题策略

    • 先做100分题保底,再攻200分题(时间分配建议:40min+40min+60min)
    • 自测用例覆盖边界值(如空输入、超大数组等)
  3. 异常处理

    • 断网/死机可重新登录恢复进度
    • 中途离开需申请(否则可能判作弊)

四、资源推荐

  • 题库更新:关注官方动态及社区新题共享(如你提供的“哪吒题库”)
  • 工具辅助
    • ChatGPT解析算法思路(但需自行编码实现)
    • LeetCode按标签筛选相似题(如华为常考的BFS/DP题型)

五、注意事项

  • 冷冻期:未通过需等待6个月才能再考
  • 语言选择:Java/Python更易上手(但需熟记基础API)
  • 代码规范:注释清晰,避免ctrl+s误操作

### 华为OD糖果问题的Python解题思路 #### 问题描述 小明从糖果盒中随意抓取一定数量的糖果,每次可以执行三种操作之一:取出一半糖果并舍去余数;如果当前糖果数目为奇数,则可以从盒子中再拿一个糖果或将手里的一个糖果放回去。目标是最少经过几次这样的操作能够使手中的糖果变为一颗。 为了达到这个目的,采用贪心策略来解决问题[^3]。具体来说,在每一步都尽可能快速地减少糖果的数量直到只剩下一颗为止。当遇到奇数个糖果时,优先考虑加一而不是减一,因为这样可以在下一轮更有效地通过除以2的方式大量削减糖果总数。 #### 贪婪算法析 对于任意正整数n表示初始糖果数: - 如果 n 是偶数,则直接将其除以2; - 若 n 为奇数,则判断 (n+1)/2 和 (n−1)/2 的大小关系,选择较小的那个作为下一步的结果,这是因为我们希望更快接近1。 这种做法基于这样一个事实——当我们面对两个连续的奇数值时,较大的那个总是可以通过增加1变成一个小得多的新值(即其半数),而较小的一个则需要两次操作才能完成同样的效果(先减后除)[^4]。 #### Python代码实现 下面给出了解决上述问题的具体Python程序: ```python def min_steps_to_one(n): steps = 0 while n != 1: if n % 2 == 0: n //= 2 elif ((n + 1) // 2) < ((n - 1) // 2): n += 1 else: n -= 1 steps += 1 return steps if __name__ == "__main__": candy_count = int(input().strip()) print(min_steps_to_one(candy_count)) ``` 此函数接收一个参数`n`代表起始的糖果数量,并返回将这些糖果减少到只有一个所需的最小步数。主程序部读入用户输入的数据并调用该方法打印最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值