鱼C论坛

 找回密码
 立即注册
查看: 9477|回复: 76

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

[复制链接]
发表于 2020-3-28 18:38:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个非负整数 n,找出小于或等于 n 的单调递增整数中最大的整数。

说明:当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,称这个整数是单调递增的。

示例 1:

输入:n = 10
输出:9
示例 2:

输入:n = 1234
输出:1234
示例 3:

输入:n = 332
输出:299


欢迎大家一起答题!
最佳答案
2020-3-28 20:25:45
本帖最后由 fan1993423 于 2020-3-28 20:35 编辑
  1. def fun361(n):
  2.     if n in range(10):return n
  3.     a,b=divmod(n,10)
  4.     flag=True
  5.     while a:
  6.         if a%10>b:
  7.             a-=1
  8.             flag,c=False,a
  9.         a,b=divmod(a,10)
  10.     return n if flag else int(str(c)+'9'*(len(str(n))-len(str(c))))
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-28 18:44:07 From FishC Mobile | 显示全部楼层
没看懂@zltzlt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 18:46:18 | 显示全部楼层

我估计你不明白单调递增的整数的概念

比如,289 是单调递增整数,因为 2 <= 8 <= 9
456 也是
但是 1231 不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-28 18:58:37 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2020-3-28 18:46
我估计你不明白单调递增的整数的概念

比如,289 是单调递增整数,因为 2

那一位数字呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 19:21:41 | 显示全部楼层
只有一个数的话是默认递增还是没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 19:39:53 | 显示全部楼层
本帖最后由 BngThea 于 2020-3-29 17:27 编辑
  1. def func(num):
  2.     bits,tmp = 0,num
  3.     numbers = []
  4.     while tmp:
  5.         numbers.append(tmp%10)
  6.         tmp //= 10        
  7.         bits +=1
  8.     if bits == 1:
  9.         return num
  10.     else:
  11.         numbers = list(reversed(numbers))
  12.         for i in range(bits-1):
  13.             if numbers[i] > numbers[i+1]:
  14.                 numbers[i] -= 1
  15.                 k = i
  16.                 while k > 0:
  17.                     if numbers[k-1] > numbers[k]:
  18.                         numbers[k] = 9
  19.                         numbers[k-1] -= 1
  20.                         k = k-1
  21.                     else:
  22.                         break
  23.                 for j in range(i+1,bits):
  24.                     numbers[j] = 9
  25.                 return int(''.join(map(str,numbers)))
  26.         else:
  27.             return num
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-28 19:40:39 | 显示全部楼层
吃瓜群众路过,看过了,在大神的提示下,还是找不到规律。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 19:43:14 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-29 13:32 编辑
  1. def f361(x):
  2.     t,b,mi=0,str(x),0
  3.     for i in range(len(b)-1):
  4.         if b[i]<b[i+1]:
  5.             t+=1
  6.         elif b[i]>b[i+1]:
  7.             if t:
  8.                 mi=i
  9.             return int(str(int(b[:mi+1])-1)+'9'*(len(b)-1-mi))
  10.         else:
  11.             if t:
  12.                 t=0
  13.                 mi=i           
  14.     return x   
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-28 19:57:59 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-28 22:09 编辑

写个效率低的
  1. def fun361(num):
  2.     def split(num):
  3.         result = []
  4.         while num:
  5.             result.append(num%10)
  6.             num = num // 10
  7.         result.reverse()
  8.         return result
  9.     if num < 10:
  10.         return num
  11.     bits = split(num)
  12.     M = len(bits)
  13.     E_position = M
  14.     G_position = M
  15.     state = False
  16.     for i in range(0,M-1):
  17.         if bits[i] == bits[i+1]:
  18.             if state == False:
  19.                 E_position = i
  20.                 state = True
  21.             else:
  22.                 pass
  23.         elif bits[i] < bits[i+1]:
  24.             if state == False:
  25.                 pass
  26.             else:
  27.                 state = False
  28.                 E_position = M
  29.         elif bits[i] > bits[i+1]:
  30.             break
  31.     for i in range(0,M-1):
  32.         if bits[i] > bits[i+1]:
  33.             G_position = i
  34.             break
  35.     if G_position > M - 1:
  36.         return num
  37.     else:
  38.         temp = 0
  39.         position = min([E_position,G_position])
  40.         for i in range(0,position+1):
  41.             temp += bits[i]*(10**(M-1-i))
  42.         return temp - 1
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-28 20:08:53 | 显示全部楼层
fan1993423 发表于 2020-3-28 19:21
只有一个数的话是默认递增还是没有

一位数是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 20:12:14 | 显示全部楼层
  1. def func(n):
  2.     while n:
  3.         list1 = list(str(n))
  4.         if list1 == sorted(list1):
  5.             return n
  6.         n -= 1
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-28 20:12:53 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-28 20:18 编辑
  1. def f361(n):
  2.     if n < 10:
  3.         return n
  4.     str_n = str(n)
  5.     result = ''
  6.     for i in range((length := len(str_n))-1):
  7.         if str_n[i] <= str_n[i+1]:
  8.             continue
  9.         elif i == 0:
  10.             return int(''.join([str(int(str_n[i]) - 1),'9'*(length-1)]))
  11.         elif (o := str(int(str_n[i])-1)) >= str_n[i-1]:
  12.             for each in str_n[:i]:
  13.                 result += each
  14.             result += o + '9' * (length-1-i)
  15.         else:
  16.             if i == 1:
  17.                 if str_n[1] == str_n[0]:
  18.                     result += str(int(str_n[0])-1)+ '99'
  19.                 else:
  20.                     result += str_n[0] + '99'
  21.             else:
  22.                 for t in list(range(i))[1::-1]:
  23.                     if str_n[t] > str_n[t-1]:
  24.                         for each in str_n[:t+1]:
  25.                             result += each
  26.                         result += str(int(str_n[t])-1)+ '9' * (length-2-t)
  27.                         return int(result)
  28.                     return int(str(int(str_n[0])-1)+ '9' * (length-1))
  29.         return int(result)
  30.     else:
  31.         return n
复制代码

有待优化,但脑子已经晕了

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-28 20:19:58 | 显示全部楼层
  1. def f361(n):
  2.     str_n_list=list(str(n))
  3.     if str_n_list==sorted(str_n_list):
  4.         return n
  5.     else:
  6.         while str_n_list!=sorted(str_n_list):
  7.             str_n_list = list(str(n))
  8.             n-=1
  9.         return n+1
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-28 20:25:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 fan1993423 于 2020-3-28 20:35 编辑
  1. def fun361(n):
  2.     if n in range(10):return n
  3.     a,b=divmod(n,10)
  4.     flag=True
  5.     while a:
  6.         if a%10>b:
  7.             a-=1
  8.             flag,c=False,a
  9.         a,b=divmod(a,10)
  10.     return n if flag else int(str(c)+'9'*(len(str(n))-len(str(c))))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2020-3-28 20:47:16 | 显示全部楼层
本帖最后由 一个账号 于 2020-3-29 11:26 编辑
  1. def func(n):
  2.     for i in range(n, 0, -1):
  3.         last = 0
  4.         for j in str(i):
  5.             if last > (last := int(j)): break
  6.         else:
  7.             return i
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-28 20:51:04 | 显示全部楼层


0 算不算?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:17:56 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-28 23:37 编辑
  1. def f361(n):   
  2.     while list(str(n)) != sorted(str(n)):
  3.         n -= 1
  4.     return n
复制代码

上面的可能超时了,试试下面的
  1. def f361(n):
  2.     num = list(str(n))
  3.     tmp = []     
  4.     for i in range(len(num)-2,-1,-1):
  5.         if num[i] > num[i+1]:
  6.             num[i] = str(int(num[i])-1)
  7.             a = len(num) - 1
  8.             tmp = []
  9.             while a > i:
  10.                 num[a] = '9'               
  11.                 tmp.append(num[a])
  12.                 a -= 1
  13.         else:
  14.             tmp.append(num[i+1])     
  15.     tmp.append(num[i])   
  16.     return int(''.join(tmp)[::-1])
复制代码

再优化一下
  1. def p361(n):
  2.     num = list(str(n))
  3.     s = ''     
  4.     for i in range(len(num)-2,-1,-1):
  5.         if num[i] > num[i+1]:
  6.             num[i] = str(int(num[i])-1)
  7.             s = ''
  8.             s += '9'* len(num[i+1:])
  9.         else:
  10.             s += num[i+1]     
  11.     s += num[i]   
  12.     return int(s[::-1])
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-28 21:31:59 | 显示全部楼层
n = 332
s = str()
def fun361(n):
    while True:
        s = str(n)
        length = len(s)
        active = False
        if length == 1:
            active = True
            break
        else:
            for i in range(length-1):
                if int(s[i]) <= int(s[i+1]):
                    active = True
                else:
                    active = False
                    break
        if active:
            break
        else:
            n -= 1
    return n

print(fun361(n))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-28 21:37:07 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-28 21:39 编辑
  1. def f361(n):
  2.     a = str(n)
  3.     b = ''
  4.     c = 0
  5.     for i in range(len(a)-1):
  6.         if a[i] <= a[i + 1]:
  7.             b += a[i]
  8.         else:
  9.             b += str(int(a[i]) - 1)
  10.             c = 1
  11.             break
  12.     if c == 1:
  13.         b = b.ljust(len(a), '9')
  14.         
  15.     elif c == 0:
  16.         b = a
  17.         int(b)
  18.     return int(b)
复制代码

请楼主帮忙看看我写的359、360,谢谢!
不知道为什么直到刚刚才刷新出来这三天的每日一题,才做的……

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1 不好意思,没有鱼币了……

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-28 21:44:57 | 显示全部楼层
  1. def findmax(num):
  2.     i = 1
  3.     while num//10**i != 0:
  4.         i += 1
  5.     ws = i - 1
  6.     ws2 = i - 1
  7.     a = []
  8.     while 1:
  9.         j = num//10**ws
  10.         a.append(j)
  11.         if j == 0:
  12.             num = num
  13.         else:
  14.             num = num - j*10**ws
  15.         ws -= 1
  16.         if ws == -1:
  17.             break
  18.     return a


  19. def func(num):
  20.     while 1:
  21.         list1 = findmax(num)
  22.         list2 = list1.copy()
  23.         list2.sort()
  24.         if list2 == list1:
  25.             break
  26.         else:
  27.             num -= 1
  28.     l = len(list1)
  29.     sum1 = 0
  30.     for i in range(l):
  31.         sum1 += list1[i]*10**(l-1)
  32.         l -= 1
  33.     print(sum1)

  34. func(332)
复制代码



我的代码好长

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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