鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: jerryxjr1220

[技术交流] 鱼C论坛Python精英挑战赛(第四季03期)

[复制链接]
发表于 2018-5-22 17:50:43 | 显示全部楼层
本帖最后由 凌九霄 于 2018-6-6 23:25 编辑
  1. import random
  2. import timeit

  3. # 生成一个十万位的随机整数
  4. test = [random.randint(0, 9) for x in range(1, 100001)]
  5. testint = int(''.join(map(str, test)))

  6. '''解题思路:不管多长的整数,都从整数末尾开始检查相邻两个数的大小,当第一次检查到当前数字大于前一位数字时,以前一位数为界,将整数截
  7.   为A,B两段,只需要考虑B段,实际将问题简化为类似 XXXXXXX243 的情况,即最高位需要用与其差值最小的数来作为最高位,其余数按从小到大排
  8.   序,和新的最高位组合成新的数,然后再用先前的A段+B段得到最终答案。
  9.   另外要说明的是,其实十万位什么的只是噱头,并没有实际意义,因为,如果不是刻意,而是随机产生的整数的话,那么99%的情况,99990或更多
  10.   位的整数会被分到不用处理的A段,真正要处理的只是B段那一个小小的数。如果是刻意,那么B段就是形如 X987654321 或者 99999999999 类似的
  11.   数,这样的B段数可能会很大,但是B段处理也依然是简单的'''

  12. def next_int(num):
  13.     numstring = str(num)
  14.     lennum = len(numstring)
  15.     for i in range(lennum - 1, 0, -1):
  16.         if int(numstring[i]) > int(numstring[i - 1]):
  17.             aSection = numstring[:i - 1]
  18.             bSection = numstring[i - 1:]

  19.             tmpnum = bSection[0] #获取B段最高位数字
  20.             tmpSection = sorted(''.join(set(bSection))) #去重后排序
  21.             firstNum = tmpSection[tmpSection.index(tmpnum) + 1]  #排序后得到差值最小的数作为最高位
  22.             bSection = list(bSection)
  23.             bSection.sort()
  24.             bSection.remove(firstNum) #移除已作为最高位的数字

  25.             return int(aSection + firstNum + ''.join(bSection))
  26.         elif i == 1:
  27.             return None


  28. print('十万位数据用时:{0}s'.format(timeit.timeit('next_int(testint)', setup='from __main__ import next_int,testint', number=1)))

复制代码

360截图20180522175023514.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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