鱼C论坛

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

关于循环中的一个小问题

[复制链接]
发表于 2022-1-28 12:44:00 | 显示全部楼层 |阅读模式

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

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

x
画框框的那部分存在的意义是啥呀???
附:原代码
plain = input("请输入需要加密的明文:")
x = input("请输入需要替换的字符:")
y = input("请输入将要替换的字符:")
    
# 加密的代码
if len(x) != len(y):
    print("需要替换的字符数量必须跟将要替换的字符数量一致!")
else:
    cipher = plain.translate(str.maketrans(x, y))
    print("加密后的密文是:" + cipher)
    
# 检测冲突的代码
# flag 变量标志是否退出检测(只要找到一个冲突,就可以直接退出)
flag = 0
    
# 如果 x 中存在相同的字符,那么 y 对应下标的字符也应该是相同的
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
    
            i = x.find(each, i+1)
    
# 如果 y 中存在相同的字符,那么 x 对应下标的字符也应该是相同的
for each in y:
    if y.count(each) > 1 and flag == 0:
        i = y.find(each)
        last = x[i]
        while i != -1:
            if last != x[i]:
                print("由于替换字符出现冲突,该密文无法解密!")
                flag = -1
                break
    
            i = y.find(each, i+1)

画框框的那部分存在的意义是啥呀???

这是题目

这是题目

这是问题

这是问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-28 12:49:37 | 显示全部楼层
意思是如果碰到要找到 each 变量,
就将最后一个设置为 each,
然后便减小寻找 each 变量的范围继续寻找 each,
如果当找不到了,那么上一个找到的就一定是最后一个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-28 14:12:15 | 显示全部楼层
x [l,o,v,e]
y [2,2,3,3]
伪代码:
for each in x的执行内容

    第一轮
    each = l
   
    #l的数量是1,不进入if
    if(l的数量 > 1 且 标记位 == 0){
    }
   
    第二轮第三轮第四轮同上,什么也不做

for each in y的执行内容
    第一轮
    each = 2
    #2在y中的数量 > 1,进入循环
    if(2在y中的数量 > 1 且 标记位 == 0)
        #i记录 2在y 中第一次出现的位置,即0
        i = 0
        
        #last表示x在i位置的元素即l
        last = l
        
        #i是位置,位置为-1表示非法
        while i != -1
            第一次循环 l == x[0],不进入if
            #i记录2在y中下一次出现的位置即i=1,没有再次出现,则i=-1
            i = x.find(each, i + 1)
            
            第二轮循环 l != x[1],进入if
                print("由于替换字符出现冲突,该密文无法解密!")
                标记为 -1
                break

======================================================
解释:
为了方便说明,我们把一对(x,y)称作一个加密对               
大概意思就是
x [l,o,v,e]
y [2,2,3,3]
时,在执行 for each in y 时,
先形成  (‘l’,2)  的加密组合,并用last记录 x 即加密对左边的'1'
然后找了一下y中 第二次出现2的位置,对应取出x中该位置的o进行比较,发现o并不等于last记录的x值,这样就说明,这个位置的加密对('o',2)就和之前我们生成的('l',2)冲突了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-28 17:07:00 | 显示全部楼层
翼是孤独 发表于 2022-1-28 14:12
x [l,o,v,e]
y [2,2,3,3]
伪代码:

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

find后面的括号为啥有俩参数啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-28 18:09:49 | 显示全部楼层
muyang_zzF6 发表于 2022-1-28 17:07
i = x.find(each, i + 1)

find后面的括号为啥有俩参数啊


描述
Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。

语法
find()方法语法:

str.find(str, beg=0, end=len(string))
参数
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度(不填就代表默认)。
返回值
如果包含子字符串返回开始的索引值,否则返回-1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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