华为OD机试D卷C卷 - 密码解密(C++ Java JavaScript Python C语言)

本文介绍华为在线开发者(OD)机试中的一道密码解密题目,涉及C++、Java、JavaScript、Python和C语言的解题方案。题目要求将使用特定映射规则加密的“密文”字符串还原成“明文”。映射规则包括用1-9对应'a'到'i',用10*到26*对应'j'到'z'。解题思路主要采用暴力替换方法,从'10*'开始进行替换。文章提供了多个测试用例及对应解密结果。

题目描述

给定一段“密文”字符串 s,其中字符都是经过“密码本”映射的,现需要将“密文”解密并输出。

映射的规则(‘a’ ~ ‘i’)分别用(‘1’ ~ ‘9’)表示;(‘j’ ~ ‘z’)分别用(“10*” ~ “26*”)表示。

约束:映射始终唯一。

输入描述

“密文”字符串

输出描述

明文字符串

备注:翻译后的文本长度在100以内

用例

输入 20*19*20*
输出 tst
说明

解题思路

暴力替换,需要注释的是先从"10*" ~ "26*开始映射替换

s=s.replace("10*","j")
s=s.replace("11*","k")
s=s.replace("12*","l")
s=s.replace("13*","m")
s=s.replace("14*","n")
s=s.replace("15*","o")
s=s.replace("16*","p")
s=s.replace("17*","q")
s=s.replace("18*","r")
s=s.replace("19*","s")
s=s.replace("20*","t")
s=s.replace("21*","u")
s=s.replace("22*","v")
s=s.replace("23*","w")
s=s.replace("24*","x")
s=s.replace("25*","y")
s=s.replace("26*","z")
s=s.replace("1","a")
s=s.replace("2","b")
s=s.replace("3","c")
s=s.replace("4","d")
s=s.replace("5","e")
s=s.replace("6","f")
s=s.replace("7","g")
s=s.replace("8","h")
s=s.replace("9","i")

C++

#include <iostream>
#include <string>
### 华为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`代表起始的糖果数量,并返回将这些糖果减少到只有一个所需的最小步数。主程序部分读入用户输入的数据并调用该方法打印最终结果。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值