python蓝桥题库2141-山

见题目

我最近买了他们官方的程序设计竞赛的书,一本紫色的,在引子部分这部分出现了这道题,最开始看代码的时候没看懂,我现在来逐层分析,你需要有一定基础来看这篇文章,还要就是我的见解

偶数情况

第一行先设置了个ans的计数变量

接下来range循环20-20223(不对啊?这和题目要求的循环数不一样不是

官方解释是这样的,看题目不难发现,会有偶数这种情况,那么右边等于左边的倒过来(对称),那么我们把循环也给折半只要判断左边的数进而可以判断右边的数

(没错,所以他就直接折半了,这里其实我也是很懵,官方说用了构造法)

然后回到程序中

第6行先将i变成字符串,设置下标flag=1,然后再循环;

拿第一个数20为例子,那么第7行代码的循环的次数为1次(此时的20是个字符串,长度为2,遍历只遍历0,1,因为第7行字符串长度-1,所以只循环1次,不然后面判断会超出索引范围),那么接下来判断字符串s中的第一位和第二位,因为2>0,所以在第一次循环的时候就直接结束了,下标为1;

现在拿123举例子,按照123字符串的长度,一共循环3-1=2次,第一次判断1与2,2大;第二次判断2与3那么3大,那么相对于的右边部分也一样,此时下标为1不变。

个人推断:这里的123是个并不是真正意义上的123,可能是没折半之前的123321,那么123321呢?这个循环是折半的,那么可以推断出123321是用来判断更大的数

奇数情况

这里的与偶数情况的差别是循环次数和第22行的判断

当为奇数时,那么中间值一定是最大的,那么例如11211只要判断2左边的数大小进而可以判断右边的数,因为他们的范围是[11111,999999999],为什么没有百位?题目从2020开始

拿11代入程序中,因为1=1,不存在谁大谁小,所以程序会跳到判断环节,为什么会有个10-int(s[i+1])?

此时中间的最大值为2,左边部分长度为s=11,末尾为1,那么中间的数可以为2~9(中间值最大),那么可以为11311、11411...那么就有10(0~9一共10个数)-2(除去前面已经被遍历过的0,1)=8个结果.

最后输出结果为3138

个人结尾

其实这个问题主要围绕着折半来解的,能理解折半就能大致理解奇偶情况,我上面的逻辑如果出问题可以在评论区指出来,我大部分内容借鉴了这本书中的回答来呈现在这篇文章中,旨在帮助做道题时跟我一样遇到困难的学者,希望我的文章对你有用!

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值