twkkndt 发表于 2022-12-6 22:10:23

给定一个字符串 s,请编程求出该字符串中的最大奇数。

s = "43383"
   
n = len(s)
for j in range(n-1, -1, -1):
    if int(s) % 2 == 1:
      # 找到第一个值为奇数的字符,返回 s
      print(s[:j+1])
      break
# 未找到值为奇数的字符,返回空字符串
else:
    print(0)
解析:

首先,如果字符串 s 中不含有值为奇数的字符串,那么 s 的任何子字符串都不可能是奇数。

其实,我们需要考虑的是题目要求找出最大奇数。

判断奇数的条件无非就是看最后一位是否为奇数,也就是说假如 s 为奇数的话,那么所有以 s 为结尾的子字符串必将都是奇数
因此,其中最大的奇数便是 s[:j+1](j 是下标,切片由于是“左闭右开”,所以需要 +1)

求助各位大佬,这句 print(s[:j+1]) ,意思没懂,看解析也没看懂{:5_107:}
虽然知道 “所有以 s 为结尾的子字符串必将都是奇数,”的意思,。。。但是不懂该怎么理解 s[:j+1]这个意思{:10_266:} {:10_266:}

cflying 发表于 2022-12-6 22:37:49

本帖最后由 cflying 于 2022-12-6 22:56 编辑

上面不是写了嘛,s,只是说写法上0可以省略,默认从头开始
如果是要问为啥+1,人家上面不是也解释了嘛,切片时右开

s就是从0位开始截取到第j位,例子中就是从0位截取到4位,直白说应该是s但是语法规则里又是右开,所以必须得s才能取到第4位

s是43383中最后一个3(第4位,从0位开始数),但是s是43383中的4338,所以要才行,这就是右开

twkkndt 发表于 2022-12-7 08:35:49

cflying 发表于 2022-12-6 22:37
上面不是写了嘛,s,只是说写法上0可以省略,默认从头开始
如果是要问为啥+1,人家上面不是也解释 ...

谢谢大锅,s,我就一下子明白了,从第一位开始输出{:10_250:}{:10_250:},真是脑子一下子没转过来
页: [1]
查看完整版本: 给定一个字符串 s,请编程求出该字符串中的最大奇数。