鱼C论坛

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

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

[复制链接]
 楼主| 发表于 2019-11-23 17:44:46 | 显示全部楼层
__mrsq__ 发表于 2019-11-23 17:43
修改了一下,不知道对不对,求测试@zltzlt

解答错误

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

使用道具 举报

发表于 2019-11-23 17:53:39 | 显示全部楼层
本帖最后由 华一仙 于 2019-11-23 18:12 编辑
  1. """
  2. 不妨设 num = 5431234
  3.                ^
  4.                j(3) 临界点(后面是升序);记 j 对应的数字为 n

  5. step 1: 从后向前,找到临界点 j
  6. step 2: 从后向前,找到第一个小于 n 的数,并且两数交换 => num' = 5421334
  7. step 3: j 后面的数做 reverse                       => num" = 5424331

  8. 最后再关注一下首位为 0 的情况
  9. """


  10. def f279(num):
  11.     if num < 10:
  12.         return -1

  13.     lst = list(str(num))
  14.     n = len(lst)
  15.     i = n - 1
  16.     while i > 0 and lst[i-1] <= lst[i]:  # 漏了个等于号
  17.         i -= 1
  18.     if i == 0:
  19.         return -1

  20.     j = i - 1
  21.     i = n - 1
  22.     while lst[j] <= lst[i]:
  23.         i -= 1
  24.     lst[i], lst[j] = lst[j], lst[i]
  25.     tmp = lst[j+1:]
  26.     tmp.reverse()
  27.     res = ''.join(lst[:j+1] + tmp)
  28.     return -1 if res[0] == '0' else int(res)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:54:59 | 显示全部楼层
华一仙 发表于 2019-11-23 17:53
这回不在原来的楼层改了

出错:IndexError: list index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:56:04 | 显示全部楼层
一个账号 发表于 2019-11-23 17:09
@zltzlt 这样应该可以了吧:

解答错误

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

使用道具 举报

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

输入:1234567908

错了,预期结果应该是:1023456789
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 17:56:54 | 显示全部楼层
一个账号 发表于 2019-11-23 17:56
错了,预期结果应该是:1023456789


不是,返回所有比原数小的数中最大的那个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 17:57:45 | 显示全部楼层
zltzlt 发表于 2019-11-23 17:56
解答错误

输入:907

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

使用道具 举报

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

不是,返回所有比原数小的数中最大的那个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 18:00:29 | 显示全部楼层
  1. #未考虑负数的情况,思路一样
  2. def f(x):
  3.     x=str(x)
  4.     a=list(x)
  5.     b=a[:]
  6.     for i in range(len(a)-1):
  7.            a1=max(a[:i+1])
  8.            n=a.index(a1)
  9.            if a1>a[i+1] and a[i+1]!='0':
  10.                a[n],a[i+1]=a[i+1],a[n]
  11.                break
  12.     if a==b:
  13.         return -1
  14.     else:
  15.         return ''.join(a)
  16. print(f(21))
  17. print(f(531))
  18. print(f(135))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

解答错误

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

使用道具 举报

发表于 2019-11-23 18:02:24 | 显示全部楼层
zltzlt 发表于 2019-11-23 17:58
不是,返回所有比原数小的数中最大的那个数

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

使用道具 举报

发表于 2019-11-23 18:13:49 | 显示全部楼层
我呢我呢

评分

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

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

发表于 2019-11-23 19:55:41 | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-11-23 20:16 编辑
  1. def fun(num):
  2.     s = str(num)
  3.     m = 0
  4.     while s[-1]=='0':
  5.         m=m+1
  6.         s=s[:-1]
  7.     n = len(s)
  8.     if '0' in s:
  9.         l = s[::-1]
  10.         a = n - l.index('0')-1
  11.     if n==1:
  12.         return -1
  13.    
  14.     for i in range(n-1,0,-1):
  15.         
  16.         if s[i] < s[i-1]:
  17.             if s[i]=='0' and s[a+1] < s[i-1]:
  18.                 tem =''
  19.                 Flag =0
  20.                 for j in s[a+1:][::-1]:
  21.                     if Flag == 0:
  22.                         if s[i-1] <= j:
  23.                             tem = tem + j
  24.                         else:
  25.                             Flag =1
  26.                             tem = j + s[i-1] + tem
  27.                     else:
  28.                         tem = tem +j
  29.             
  30.                 res = s[0:i-1] + tem +(a-i+1+m)*'0'
  31.             else:
  32.                 tem =''
  33.                 Flag =0
  34.                 for j in s[i:][::-1]:
  35.                     if Flag == 0:
  36.                         if s[i-1] <= j:
  37.                             tem = tem + j
  38.                         else:
  39.                             Flag =1
  40.                             tem = j + s[i-1] + tem
  41.                     else:
  42.                         tem = tem +j
  43.                 res = s[0:i-1] + tem +(m)*'0'
  44.             return int(res) if res[0]!='0' else -1
  45.             
  46.     return -1
  47.         
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 19:56:25 | 显示全部楼层
脑瓜仁疼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 20:36:14 | 显示全部楼层

恭喜通过!

执行用时:816 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-23 20:38:00 | 显示全部楼层

解答错误

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

使用道具 举报

发表于 2019-11-23 20:50:35 | 显示全部楼层
我改变了一下思路,从末位开始考虑,用字典哈希会不会快一点
  1. def f279(num):

  2.     st = str(num)
  3.     le = len(st)
  4.     d = {i: st[i] for i in range(len(st))}

  5.     def 交换(f, l: dict):
  6.         flag = f - 1
  7.         for i in range(flag - 1, -1, -1):
  8.             if l[i] > l[f - 1]:
  9.                 l[i], l[f - 1] = l[f - 1], l[i]
  10.                 if l[0] != "0":
  11.                     return (i + 1, l)
  12.         else:
  13.             if flag == -1:  # 调用递归之前看看有无必要
  14.                 return -1
  15.             return 交换(flag, l)

  16.     r = 交换(le, d)
  17.     if r == -1:  # -1就是不符合情况
  18.         return -1
  19.     temp1_count = 0
  20.     temp1 = []
  21.     while temp1_count < r[0]:
  22.         temp1.append(r[1][temp1_count])
  23.         temp1_count += 1
  24.     temp2_count = r[0]
  25.     temp2 = []
  26.     while temp2_count <= le - 1:
  27.         temp2.append(r[1][temp2_count])
  28.         temp2_count += 1
  29.     temp2.sort(reverse=True)
  30.     temp1.extend(temp2)
  31.     return int(''.join(temp1))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 21:00:18 | 显示全部楼层
  1. def fun(num):
  2.     s = str(num)
  3.     m = 0
  4.     while s[-1]=='0':
  5.         m=m+1
  6.         s=s[:-1]
  7.     n = len(s)
  8.     if '0' in s:
  9.         l = s[::-1]
  10.         a = n - l.index('0')-1
  11.     if n==1:
  12.         return -1
  13.    
  14.     for i in range(n-1,0,-1):
  15.         
  16.         if s[i] < s[i-1]:
  17.             if s[i]=='0' and s[a+1] < s[i-1]:
  18.                 tem =''
  19.                 Flag =0
  20.                 for j in s[a+1:][::-1]:
  21.                     if Flag == 0:
  22.                         if s[i-1] <= j:
  23.                             tem = tem + j
  24.                         else:
  25.                             Flag =1
  26.                             tem = j + tem + s[i-1]
  27.                     else:
  28.                         tem = tem +j
  29.             
  30.                 res = s[0:i-1] + tem +(a-i+1+m)*'0'
  31.             else:
  32.                 tem =''
  33.                 Flag =0
  34.                 for j in s[i:][::-1]:
  35.                     if Flag == 0:
  36.                         if s[i-1] <= j:
  37.                             tem = tem + j
  38.                         else:
  39.                             Flag =1
  40.                             tem = j + tem + s[i-1]
  41.                     else:
  42.                         tem = tem +j
  43.                 res = s[0:i-1] + tem +(m)*'0'
  44.             return int(res) if res[0]!='0' else -1
  45.             
  46.     return -1
复制代码

我又来了,不好意思,发现有个地方不小心写反了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-23 21:34:28 | 显示全部楼层
本帖最后由 fish_b 于 2019-11-23 21:49 编辑


  1. def f279(n):
  2.     result=-1
  3.     if n:
  4.         list_n=list(map(lambda x: int(x), list(str(n))))
  5.         i=len(list_n)-2
  6.         j=len(list_n)-1
  7.         max_n=max(list_n)
  8.         copy=list_n[:]
  9.         while i<j and j>0:
  10.             if i == -1:
  11.                 j-=1
  12.                 i=j-1
  13.                 continue
  14.             if list_n[j] ==max_n:
  15.                 j-=1
  16.                 i=j-1
  17.                 continue
  18.             if list_n[i]>list_n[j]:
  19.                 list_n[i],list_n[j] = list_n[j],list_n[i]
  20.                 exchange=list_n[i+1:]
  21.                 exchange.sort(reverse=True)
  22.                 list_n[i + 1:]=exchange
  23.                 break
  24.             else:
  25.                 i-=1

  26.         if copy!=list_n and list_n[0]!=0:
  27.             result=''.join(list(map(lambda x: str(x), list_n)))
  28.     return result





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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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