最新华为OD机试真题——(E卷,200分) - 字符串拼接(python)

题目描述

给定 M(0 < M ≤ 30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为 N(0 < N ≤ 5)的字符串,要求相同的字符不能相邻。计算出给定的字符列表能拼接出多少种满足条件的字符串。

输入非法或者无法拼接出满足条件的字符串则返回0。

输入描述

输入由两个部分组成:

  • 字符列表(包含字符通过空格分隔)
  • 目标字符串的长度 N,使用空格连接。

输出描述

输出满足条件的字符串个数。

示例输入/输出

用例 1

输入:

aab 2

输出:

2

说明:
这个字符列表只能构成字符串 “ab” 和 “ba”。

用例 2

输入:

abc 2

输出:

6

说明:
可以构成的字符串有: “ab”, “ac”, “ba”, “bc”, “ca”, “cb”。

注意事项

  • 字符列表中每个字符都是大写或小写的英文字母(a-z),且字母可以重复。
  • 当字符数量不足以形成目标长度的字符串时,应该返回0。
  • 如果输入内容不合法,输出也应为0。

python源码

# 导入所需的模块
from collections import defaultdict

# 递归生成满足条件的不同字符串
def generate_unique_strings(character_sequence, target_length, current_combination, unique_results, used_flags):
    # 当生成的字符串长度等于指定长度时,将其加入到结果集中
    if len(current_combination) == target_length:
        unique_results.add(current_combination)
        return

    # 遍历输入的字符序列
    for index in range(len(character_sequence)):
        # 判断字符是否已经被使用,或者当前字符与前一个字符相同
        if used_flags[index] or (len(current_combination) > 0 and current_combination[-1] == character_sequence[index]):
            continue  # 如果字符已被使用或与前一个字符相同,则跳过当前字符
        used_flags[index] = True  # 标记当前字符为已使用
        # 递归调用生成下一个字符
        generate_unique_strings(character_sequence, target_length, current_combination + character_sequence[index], unique_results, used_flags)
        used_flags[index] = False  # 取消标记当前字符的使用状态,以便下一次遍历

# 计算满足条件的不同字符串的数量
def count_unique_strings(character_sequence, target_length):
    # 创建一个集合来存储不同的字符串
    unique_strings_set = set()
    # 创建一个列表来标记输入中的字符是否已经被使用
    used_flags = [False] * len(character_sequence)
    # 调用generate_unique_strings方法生成满足条件的不同字符串
    generate_unique_strings(character_sequence, target_length, "", unique_strings_set, used_flags)
    # 返回不同字符串的数量
    return len(unique_strings_set)

# 读取用户输入的字符序列和目标长度
input_string = input()
# 将输入的字符串按空格分割为两个部分,分别为输入字符序列和目标字符串长度
input_parts = input_string.split(" ")
character_sequence = input_parts[0]  # 获取输入的字符序列
target_length = int(input_parts[1])  # 将输入的长度部分转换为整数

# 调用count_unique_strings方法计算满足条件的不同字符串的数量
result_count = count_unique_strings(character_sequence, target_length)
# 输出计算结果
print(result_count)

关于华为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、付费专栏及课程。

余额充值