鱼C论坛

 找回密码
 立即注册
查看: 295|回复: 6

[已解决]python 27讲动手0

[复制链接]
发表于 2025-2-27 12:52:45 | 显示全部楼层 |阅读模式

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

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

x
题目如下

0. 请按照以下规则整理一个给定的字符串 s。s.yhkq
m>2G=`rz9ZPK#JX}*S-']
一个整理好的字符串中,两个相邻字符 s[j] 和 s[j+1],其中 0 <= j <= s.length - 2,要满足如下条件:G>j)"I
A#2N(']*=yl<pe5!D[9Gr)Z:~,CP
若 s[j] 是小写字符,则 s[j+1] 不可以是相同的大写字符
若 s[j] 是大写字符,则 s[j+1] 不可以是相同的小写字符
如果 s[j] 和 s[j+1] 满足以上两个条件,则将它们一并删除

举例:Powered by https://fishc.com.cn
M+vf&:JC{S(Tg~qY]70m)8Ij
整理前:"FishCcCode"来自:https://fishc.com.cn
整理后:"FishCcCode" -> "FishCode")f|_
F.u{n2=kryD<KWmx%#*qB|s~S
整理前:"AbBaACc"Powered by https://fishc.com.cn
整理后:"AbBaACc" -> "AaACc" -> "AaA" -> "A"3KqO<jLb
cz}m-08~)AHeQwb kd.O'WUx"C
整理前:"AABaAbCc"Powered by https://fishc.com.cn
整理后:"AABaAbCc" -> "AABbCc" -> "AACc" -> "AA"USC`c~IiE
[}!76j"]{#PU*,_`zZJboF
请按要求整理好字符串,并将结果打印到屏幕上。]-FcA0}


  1. s = input("请输入一个字符串:")

  2.    

  3. res = []

  4. for each in s:

  5.     if res and res[-1].lower() == each.lower() and res[-1] != each:

  6.         res.pop()

  7.     else:

  8.         res.append(each)

  9.    

  10. for each in res:

  11.     print(each, end='')
复制代码



可以分步详细讲解一下吗,没有理解,谢谢,不知道怎样才可以多次整理,如果不用这种办法的话还有别的办法吗
最佳答案
2025-2-27 16:16:53
本帖最后由 jackz007 于 2025-2-27 16:39 编辑

         参考这段代码:
  1. s = input("请输入一个字符串:")
  2. res = []
  3. for each in s:
  4.     if res and res[-1].lower() == each.lower() and res[-1] != each:
  5.         res.pop()
  6.     else:
  7.         res . append(each)
复制代码


        下面通过举例进行讲解。
        假如,你键入的是 "XABCcbaZ",s 有 8 个字符,这个循环将会循环 8 次,头 4 次循环由于 if 条件为 False,所以,执行 res . append(each) 指令的结果,使 s[0] - s[3] 依次进入 res,到第 5 次循环开始的时候,res = ['X' , 'A' , 'B' , 'C'],res[-1] = 'C',each = s[4] = 'c',、二者显然存在同一个字母的大小写关系,就是说,if 的条件为 True,于是,执行 res . pop(),第 5 次循环结束;第 6 次循环开始的时候,res = ['X' , 'A' , 'B'],res[-1] = 'B' ,each = s[5] = 'b',if 条件为 True,继续执行 res . pop(),第 6 次循环结束;第 7 次循环开始的时候,res = ['X' , 'A'],res[-1] = 'A' ,each = s[6] = 'a',if 条件为 True,继续执行 res . pop(),第 7 次循环结束;第 8 次循环开始的时候,res = ['X'],res[-1] = 'X',each = s[7] = 'Z',if 条件为 False,执行 res . append(each),第 8 次循环结束,最后,res = ['X' , 'Z']。

        要实现题目要求的功能,使用列表代码最为简洁,当然,不使用列表也是完全可以的,下面的代码就没有用到列表
  1. s , k = input("请输入一个字符串:") , 1
  2. while k < len(s) :
  3.     if s[k] == s[k - 1] . swapcase() :
  4.         s = s[: k - 1] + s[k + 1 :]      # 剔除 s[k - 1 : k + 1],重新合成 s
  5.         if k > 1 :                       # 如果指针不在字符串开头
  6.             k -= 1                       # 指针回退 1 个字符,以便下一次循环可以检查拼接处两个字符构成的新组合
  7.     else :
  8.         k += 1
  9. print(s)
复制代码

        运行实况:
  1. D:\[exercise]\Python>python x.py
  2. 请输入一个字符串:XABCcbaZ
  3. XZ

  4. D:\[exercise]\Python>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-27 12:54:02 | 显示全部楼层
当然可以!我们来分步解释一下这段代码。

首先,你需要了解这个问题的核心思想是连着的不同大小写的字母会互相抵消。例如,"Aa"、"Bb" 都应该被去掉。

接下来,我们来看代码:

1. 初始化:
  
  1. s = input("请输入一个字符串:")
复制代码

   这一行让用户输入一个字符串。

2. 准备存储结果:
  
  1. res = []
复制代码

   用一个空列表 `res` 来存储整理后的字符。

3. 遍历输入字符串:
  
  1. for each in s:
复制代码

   这个循环逐个字符遍历输入字符串。

4. 判断是否抵消相邻字符:
  
  1. if res and res[-1].lower() == each.lower() and res[-1] != each:
  2.        res.pop()
复制代码

   - res 是不为空的,这意味着至少有一个字符已经加入了结果。
   - `res[-1].lower() == each.lower()` 检查当前字符和结果中最后一个字符是否为同一字母,只是大小写不同。
   - `res[-1] != each` 确认它们确实大小写不同。
   - 如果满足条件,就用 `res.pop()` 移除结果中的最后一个字符,因为它们相互抵消。

5. 否则添加字符:
  
  1. else:
  2.        res.append(each)
复制代码

   如果上面的条件不满足,直接将当前字符加入 `res`。

6. 输出最终结果:
  
  1. for each in res:
  2.        print(each, end='')
复制代码

   遍历 `res` 并打印整理后的字符串,`end=''` 确保所有字符在同一行输出。

如果不用这种办法,也可以考虑使用递归函数来反复消除相邻的不同大小写字母对,但效率可能会低于上述方法。

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

使用道具 举报

发表于 2025-2-27 16:16:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-2-27 16:39 编辑

         参考这段代码:
  1. s = input("请输入一个字符串:")
  2. res = []
  3. for each in s:
  4.     if res and res[-1].lower() == each.lower() and res[-1] != each:
  5.         res.pop()
  6.     else:
  7.         res . append(each)
复制代码


        下面通过举例进行讲解。
        假如,你键入的是 "XABCcbaZ",s 有 8 个字符,这个循环将会循环 8 次,头 4 次循环由于 if 条件为 False,所以,执行 res . append(each) 指令的结果,使 s[0] - s[3] 依次进入 res,到第 5 次循环开始的时候,res = ['X' , 'A' , 'B' , 'C'],res[-1] = 'C',each = s[4] = 'c',、二者显然存在同一个字母的大小写关系,就是说,if 的条件为 True,于是,执行 res . pop(),第 5 次循环结束;第 6 次循环开始的时候,res = ['X' , 'A' , 'B'],res[-1] = 'B' ,each = s[5] = 'b',if 条件为 True,继续执行 res . pop(),第 6 次循环结束;第 7 次循环开始的时候,res = ['X' , 'A'],res[-1] = 'A' ,each = s[6] = 'a',if 条件为 True,继续执行 res . pop(),第 7 次循环结束;第 8 次循环开始的时候,res = ['X'],res[-1] = 'X',each = s[7] = 'Z',if 条件为 False,执行 res . append(each),第 8 次循环结束,最后,res = ['X' , 'Z']。

        要实现题目要求的功能,使用列表代码最为简洁,当然,不使用列表也是完全可以的,下面的代码就没有用到列表
  1. s , k = input("请输入一个字符串:") , 1
  2. while k < len(s) :
  3.     if s[k] == s[k - 1] . swapcase() :
  4.         s = s[: k - 1] + s[k + 1 :]      # 剔除 s[k - 1 : k + 1],重新合成 s
  5.         if k > 1 :                       # 如果指针不在字符串开头
  6.             k -= 1                       # 指针回退 1 个字符,以便下一次循环可以检查拼接处两个字符构成的新组合
  7.     else :
  8.         k += 1
  9. print(s)
复制代码

        运行实况:
  1. D:\[exercise]\Python>python x.py
  2. 请输入一个字符串:XABCcbaZ
  3. XZ

  4. D:\[exercise]\Python>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-2-28 10:06:05 | 显示全部楼层

懂了懂了,谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-28 10:27:37 | 显示全部楼层
但是最后的那个k>1 ,k-=1还是不够理解,剔除的是一对能够理解,题目的意思也理解了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-28 12:33:27 | 显示全部楼层
本帖最后由 jackz007 于 2025-2-28 12:44 编辑
TJ0929 发表于 2025-2-28 10:27
但是最后的那个k>1 ,k-=1还是不够理解,剔除的是一对能够理解,题目的意思也理解了


s = 'XABCcbaZ'        k = 4 , 剔除 s[k - 1] = s[3] = 'C'、s[k] = s[4] = 'c'
s = 'XABbaZ'           k = 3 , 剔除 s[k - 1]  = s[2] = 'B'、s[k] = s[3] = 'b'
s = 'XAaZ'               k = 2 , 剔除 s[k - 1]  = s[1] = 'A'、s[k] = s[2] = 'a'
s = 'XZ'
       在剔除字符后 k = k - 1 道理很简单,当第一次在剔除掉 'Cc' 后,被删除字符两侧本来不相邻的 'B' 和 'b' 成了新邻居,所以,必须得回过头来检查这俩字符,这就是 k 回头的全部道理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-3-8 13:11:09 | 显示全部楼层
jackz007 发表于 2025-2-28 12:33
s = 'XABCcbaZ'        k = 4 , 剔除 s[k - 1] = s[3] = 'C'、s[k] = s[4] = 'c'
s = 'XABbaZ'        ...

现在理解了,也就是这个变量一直在更新,每一次都会循环一次,知道最后完成要求,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 23:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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