TJ0929 发表于 昨天 12:52

python 27讲动手0

题目如下

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

举例: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}


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

   

res = []

for each in s:

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

      res.pop()

    else:

      res.append(each)

   

for each in res:

    print(each, end='')



可以分步详细讲解一下吗,没有理解,谢谢,不知道怎样才可以多次整理,如果不用这种办法的话还有别的办法吗

FishC 发表于 昨天 12:54

当然可以!我们来分步解释一下这段代码。

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

接下来,我们来看代码:

1. 初始化:
   s = input("请输入一个字符串:")
   这一行让用户输入一个字符串。

2. 准备存储结果:
   res = []
   用一个空列表 `res` 来存储整理后的字符。

3. 遍历输入字符串:
   for each in s:
   这个循环逐个字符遍历输入字符串。

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

5. 否则添加字符:
   else:
       res.append(each)
   如果上面的条件不满足,直接将当前字符加入 `res`。

6. 输出最终结果:
   for each in res:
       print(each, end='')
   遍历 `res` 并打印整理后的字符串,`end=''` 确保所有字符在同一行输出。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 昨天 16:16

本帖最后由 jackz007 于 2025-2-27 16:39 编辑

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

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

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

D:\\Python>

TJ0929 发表于 10 小时前

jackz007 发表于 2025-2-27 16:16
参考这段代码:




懂了懂了,谢谢!!!

TJ0929 发表于 9 小时前

但是最后的那个k>1 ,k-=1还是不够理解,剔除的是一对能够理解,题目的意思也理解了

jackz007 发表于 7 小时前

本帖最后由 jackz007 于 2025-2-28 12:44 编辑

TJ0929 发表于 2025-2-28 10:27
但是最后的那个k>1 ,k-=1还是不够理解,剔除的是一对能够理解,题目的意思也理解了

s = 'XABCcbaZ'      k = 4 , 剔除 s = s = 'C'、s = s = 'c'
s = 'XABbaZ'         k = 3 , 剔除 s= s = 'B'、s = s = 'b'
s = 'XAaZ'               k = 2 , 剔除 s= s = 'A'、s = s = 'a'
s = 'XZ'
       在剔除字符后 k = k - 1 道理很简单,当第一次在剔除掉 'Cc' 后,被删除字符两侧本来不相邻的 'B' 和 'b' 成了新邻居,所以,必须得回过头来检查这俩字符,这就是 k 回头的全部道理。
页: [1]
查看完整版本: python 27讲动手0