鱼C论坛

 找回密码
 立即注册
查看: 52|回复: 4

第28讲课后练习,动动手第2题,替换出现冲突是什么意思

[复制链接]
发表于 前天 15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,不是很明白为什么要检查冲突,以至于后面检查冲突的代码不能理解。
比如:
for each in x:
    if x.count(each) > 1 and flag == 0:
        i = x.find(each)
        last = y[i]
        while i != -1:
            if last != y[i]:
                print("由于替换字符出现冲突,该密文无法解密!")
                flag = -1
                break
不是很理解,初始就已经将last赋值 y[i],为什么后面会出现last!= y[i]的情况?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 15:54 | 显示全部楼层
在替换密码解密中,"替换出现冲突"是指同一个密文字符被要求映射到多个不同的明文字符,违反了替换密码必须一一对应的规则。具体到你的代码片段,问题在于逻辑实现有误:

冲突检测的正确逻辑:
1. 同一个密文字符在密文中多次出现时
2. 它在明文中对应位置的所有字符必须完全相同
3. 如果出现不同值,说明映射关系矛盾,无法解密

你代码的问题分析:

  1. for each in x:                     # 遍历密文字符
  2.     if x.count(each) > 1 and flag == 0:
  3.         i = x.find(each)
  4.         last = y                   # 这里y是当前循环的明文字符?错误根源!
  5.         while i != -1:
  6.             if last != y:          # 此处y未更新,永远等于last
  7.                 print("冲突")
  8.                 break
复制代码


问题出在:
1. y 应该是明文字符串,但被当作单个字符使用
2. last = y 赋值后,循环内y未变化
3. 导致 last != y 永远不成立

正确实现方法:

  1. mapping = {}  # 存储密文->明文的映射
  2. for i in range(len(cipher)):  # 同时遍历密文和明文
  3.     c = cipher[i]
  4.     p = plain[i]
  5.    
  6.     if c in mapping:          # 如果该密文字符已存在映射
  7.         if mapping[c] != p:   # 检查映射是否一致
  8.             print(f"冲突:密文'{c}' 既映射到'{mapping[c]}'又映射到'{p}'")
  9.             return
  10.     else:
  11.         mapping[c] = p       # 新建映射
复制代码


关键理解:
假设:
密文 = "abb"
明文 = "xyz"
当处理到第二个字符时:
- 密文 'b' 映射到 'y'
当处理到第三个字符时:
- 密文 'b' 再次出现,但要求映射到 'z' ≠ 'y'
→ 这就是冲突(一个密文字符不能对应多个明文字符)

这就是为什么必须检查每个密文字符的所有出现位置是否对应相同的明文字符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:26 | 显示全部楼层
  1. # 如果 x 中存在相同的字符,那么 y 对应下标的字符也应该是相同的
  2. for each in x:
  3.     if x.count(each) > 1 and flag == 0:
  4.         i = x.find(each)
  5.         last = y[i]
  6.         while i != -1:
  7.             if last != y[i]:
  8.                 print("由于替换字符出现冲突,该密文无法解密!")
  9.                 flag = -1
  10.                 break
  11.    
  12.             i = x.find(each, i+1)
复制代码

是不是忽略了下面还有这句代码:

i = x.find(each, i+1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 10:17 | 显示全部楼层
小甲鱼的二师兄 发表于 2025-6-24 20:26
是不是忽略了下面还有这句代码:

i = x.find(each, i+1)

我不理解的是,前面last的初始赋值是y[i],循环开始以后,为什么last!=y[i]时,print“由于替换字符出现冲突,该密文无法解密!”是因为两个不同的y值等于同一个x值,所以显示冲突吗?我对密码规则不是很清楚。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:19 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-26 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表