见题目
我最近买了他们官方的程序设计竞赛的书,一本紫色的,在引子部分这部分出现了这道题,最开始看代码的时候没看懂,我现在来逐层分析,你需要有一定基础来看这篇文章,还要就是我的见解
偶数情况
第一行先设置了个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
个人结尾
其实这个问题主要围绕着折半来解的,能理解折半就能大致理解奇偶情况,我上面的逻辑如果出问题可以在评论区指出来,我大部分内容借鉴了这本书中的回答来呈现在这篇文章中,旨在帮助做道题时跟我一样遇到困难的学者,希望我的文章对你有用!
标签:折半,123,判断,python,那么,蓝桥,循环,2141,字符串 From: https://blog.csdn.net/2301_77817844/article/details/137434768