题目描述
给定 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职位特点:
- 校准与可靠性:经过专业校准,确保高可靠性和长期稳定性。
- 集成与功耗:传感器通过单线串行接口集成,体积小,功耗低。
- 适用场景:适用于多种应用场景,具有4针单排引脚封装,方便连接。
- 工作内容:与正式员工一起在华为研究所办公,工作内容基本相同。
- 工作时间:弹性工作制,一般一二四需补工时至晚上20:30,三五正常下班,周末双休,月末周六加班双倍工资。
- 学历与经验:要求本科及以上学历,理工类专业优先,有编程语言基础和基础算法知识。
- 转正要求:工作满一年,通过专业级可信认证,绩效至少拿过一次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分钟/题(模拟考试压力)
- 闭卷编码:先独立完成再看解析,避免“虚假掌握”
- 查重规避:修改变量名、调整逻辑顺序、添加注释(直接复制易被查重)
三、考试实战技巧
-
环境准备
- 使用Chrome浏览器,关闭无关网页(防弹窗违规)
- IDE本地编码后粘贴(避免在线编辑器卡顿)
-
答题策略
- 先做100分题保底,再攻200分题(时间分配建议:40min+40min+60min)
- 自测用例覆盖边界值(如空输入、超大数组等)
-
异常处理
- 断网/死机可重新登录恢复进度
- 中途离开需申请(否则可能判作弊)
四、资源推荐
- 题库更新:关注官方动态及社区新题共享(如你提供的“哪吒题库”)
- 工具辅助:
- ChatGPT解析算法思路(但需自行编码实现)
- LeetCode按标签筛选相似题(如华为常考的BFS/DP题型)
五、注意事项
- 冷冻期:未通过需等待6个月才能再考
- 语言选择:Java/Python更易上手(但需熟记基础API)
- 代码规范:注释清晰,避免
ctrl+s
误操作