鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 279

[复制链接]
 楼主| 发表于 2019-11-23 13:16:09 | 显示全部楼层
peicd 发表于 2019-11-22 23:39
姑且认为是首位不是首尾,打错了,不然整句话有矛盾

解答错误

输入:1234567908
输出:1234567098
预期结果:1234567890
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 13:18:09 | 显示全部楼层

解答错误

输入:907
输出:-1
预期结果:790

抱歉打错了,是首位不是首尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 13:19:25 | 显示全部楼层
本帖最后由 华一仙 于 2019-11-25 17:55 编辑

我的答案楼层从 41 变成了 42 。。。
那个 IndexError 应该是 line21 漏了等号的缘故,我觉得加上后就没问题了,可惜没测时间。。。
line31-32 的 tmp 可以省掉,所以我再更新一下:
  1. def f279(num):
  2.     if num < 21:
  3.         return -1

  4.     lst = list(str(num))
  5.     i = n = len(lst) - 1
  6.     while i > 0 and lst[i-1] <= lst[i]:
  7.         i -= 1
  8.     if i == 0:
  9.         return -1

  10.     j, i = i - 1, n
  11.     while lst[j] <= lst[i]:
  12.         i -= 1
  13.     lst[j], lst[i] = lst[i], lst[j]
  14.     res = ''.join(lst[:j+1] + lst[:j:-1])
  15.     return -1 if res[0] == '0' else int(res)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1 无条件支持楼主!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-11-23 13:20:08 | 显示全部楼层
都淡忘 发表于 2019-11-23 13:15
我仔细看了半小时评论加例子才看清题意,佛了,意思说的不明不白的
题意是这样的?
第一,交换是任意交换 ...

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

使用道具 举报

 楼主| 发表于 2019-11-23 13:21:09 | 显示全部楼层

解答错误

输入:907
输出:709
预期结果:790
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 14:47:07 | 显示全部楼层
zltzlt 发表于 2019-11-23 08:32
返回 135、351、315、513 等等最小但离原数最大的那一个

相对较小,但是与原数相差最小的。
是这意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 14:59:44 | 显示全部楼层
本帖最后由 凌九霄 于 2019-11-23 15:19 编辑

https://fishc.com.cn/forum.php?m ... 175&pid=4203504
总觉得这题目很熟悉,查一下这题目确实已经做过了,所以我又把从前做的答案抄了来充数

原题:
https://fishc.com.cn/forum.php?m ... 232&pid=4107626
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 15:31:29 | 显示全部楼层
阴阳神万物主 发表于 2019-11-23 14:47
相对较小,但是与原数相差最小的。
是这意思吗?

是。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 15:58:43 | 显示全部楼层
凌九霄 发表于 2019-11-23 14:59
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=151175&pid=4203504
总觉得这题目很熟 ...

题目是一个人出的。
https://fishc.com.cn/forum.php?m ... 928&pid=4197234
楼主得到题目建议的那层楼
并且,淘贴专辑不一样,楼主可能没看见你说的那个原题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 16:02:12 | 显示全部楼层
都淡忘 发表于 2019-11-23 13:15
我仔细看了半小时评论加例子才看清题意,佛了,意思说的不明不白的
题意是这样的?
第一,交换是任意交换 ...

被你这么一说我终于看懂题意了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 16:21:31 | 显示全部楼层
本帖最后由 都淡忘 于 2019-11-23 17:23 编辑

我直接用排列组合的包了
首先,数字n位数,想象成放入n个盒子中
那么排列的所有可能就是n!,但是数字中可能会有相同的数字,那么不妨假设有m个的1数字,那么最后产生不同的数字有n!/m!(,如果还有其他相同数字再继续),开头是0的样式排除,然后用原数去截断得到集合s,s再取最大值
下面告诉程序,既然是阶乘,必须用到迭代器或者生成器。。。才会快,我自己用的time.clock去计算的时间
  1. import itertools

  2. # python 的标准库手册推荐在任何情况下尽量使用time.clock().
  3. # 只计算了程序运行CPU的时间,返回值是浮点数
  4. import time
  5. start = time.clock()


  6. def f279(num: int):
  7.     st = str(num)
  8.     temp = []
  9.     for i in set(itertools.permutations(st)):  # 去除重复的样式
  10.         if i[0] == "0":  # 去除0开头样式
  11.             continue
  12.         n = int("".join(i))
  13.         if n < num:  # 严格截断
  14.             temp.append(n)
  15.     # print(temp)
  16.     try:
  17.         return max(temp)
  18.     except ValueError:
  19.         return -1


  20. print(f279(54697813))
  21. end = time.clock()
  22. print('Running time: %s Seconds' % (end-start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 16:55:10 | 显示全部楼层

你的这楼我看着咋是空的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:09:45 | 显示全部楼层
本帖最后由 一个账号 于 2019-11-23 17:53 编辑

@zltzlt 这样应该可以了吧:
  1. def fun(value):
  2.     value = str(value)
  3.     pristine = list(value)
  4.     mod = []
  5.     temp = []
  6.     num = 0
  7.     run = False
  8.    
  9.     for i in value:
  10.         mod.append(i)     
  11.     mod.sort()
  12.    
  13.     for i in mod[:]:
  14.         if i == "0":
  15.             temp.append(i)
  16.             mod.remove(i)
  17.             
  18.     temp = "".join(temp)
  19.    
  20.     for i in range(len(mod)):
  21.         if i != 0:
  22.             if int(num) <= int("".join(mod)):
  23.                 mod.insert(i, temp)
  24.                 num = int("".join(mod))
  25.                 if run:
  26.                     del mod[i-1]
  27.                 run = True

  28.     if pristine == mod:
  29.         return -1
  30.     return "".join(mod)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:10:14 | 显示全部楼层
之前那个还没过审,但是我自己发现毛病了,又没办法编辑,所以重新发了这么一楼
  1. def solve(num:int)->int:
  2.     temp = str(num)
  3.     if list(temp) == sorted(temp):
  4.         return -1#没有再小的了
  5.     encode = lambda iteritor : [iteritor.count(x) for x in '0123456789']
  6.     begin = encode(temp)
  7.     if begin.count(0) == 9 or (begin[1:].count(0)==8 and max(begin[1:])==1):
  8.         return -1
  9.     n = (10 ** (len(temp)-1))*int(temp[0])
  10.     while n:# and num:
  11.         num -= 1
  12.         if encode(str(num)) == begin:
  13.             return num
  14.         n -= 1
  15.     else:
  16.         return -1#首位不得不为 0

  17. if __name__ == '__main__':
  18.     print('示例1 12 输出:',solve(21))
  19.     print('示例2 513 输出:',solve(531))
  20.     print('示例3 -1 输出:',solve(135))
  21.     print('别人错的 1234567890 输出:',solve(1234567908))
  22.     print('别人错的 790 输出:',solve(907))
  23.     print('自测 -1 输出:',solve(1012))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:13:26 | 显示全部楼层

解答错误

输入:907
输入:79
预期结果:790
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:21:03 | 显示全部楼层
阴阳神万物主 发表于 2019-11-23 17:10
之前那个还没过审,但是我自己发现毛病了,又没办法编辑,所以重新发了这么一楼

超时:总执行时长超过 12 秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:23:07 | 显示全部楼层
阴阳神万物主 发表于 2019-11-23 16:55
你的这楼我看着咋是空的?

我在改。。。。用迭代器快多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:28:31 | 显示全部楼层
都淡忘 发表于 2019-11-23 16:21
我直接用排列组合的包了
首先,数字n位数,想象成放入n个盒子中
那么排列的所有可能就是n!,但是数字中可 ...

严重超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:29:03 | 显示全部楼层
zltzlt 发表于 2019-11-23 17:13
解答错误

输入:907

我知道,正在改......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:43:05 | 显示全部楼层
  1. def fun(num):
  2.     s = str(num)
  3.     n = len(s)
  4.     res=''
  5.     if n==1:
  6.         return -1
  7.     for i in range(n-1,0,-1):
  8.         if s[i] < s[i-1]:
  9.             res = s[0:i-1]+s[i]+s[i-1]+s[i+1:]
  10.             if res[0]!= '0':
  11.                 return int(res)
  12.             
  13.     for i in res[2:]:
  14.         if i != '0':
  15.             if i >= res[1]:
  16.                 return -1
  17.             else:
  18.                 return int(i+s[0:s.index(i)]+s[s.index(i)+1:])

  19.     return -1
复制代码

修改了一下,不知道对不对,求测试@zltzlt

评分

参与人数 1贡献 +1 收起 理由
zltzlt + 1

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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