鱼C论坛

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

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

[复制链接]
发表于 2020-3-28 21:53:21 | 显示全部楼层
先占楼。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 23:39:40 | 显示全部楼层
本帖最后由 sjtuszy 于 2020-3-29 00:00 编辑
  1. import math
  2. def fun361(n):
  3.     if n == 0:
  4.         return n
  5.     num = int(math.log10(n)) + 1 # n 是 num位数
  6.     for t in range(1, num):  # n 从左数第t个数比第t+1个数大的话,则相应的数减1即可
  7.         if (n // 10**(num - t)) % 10 > (n // 10**(num - t - 1)) % 10:
  8.             return (n - n % 10**(num - t) - 1)
  9.             break
  10.     return n
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-29 00:27:35 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-31 19:47 编辑
  1. def f361(num):
  2.     num = str(num)
  3.     numlist = list(num)
  4.     count = len(num)

  5.     numlist0 = numlist[:]  #deep copy原始数据
  6.    
  7.     i=0
  8.     while i < count:
  9.         if min(numlist0) == numlist0[0]:
  10.             i += 1
  11.             numlist0 = numlist0[1:]
  12.         #当数组中最小值与最高位数字一致,则往后推算,并以i记录指针位置
  13.             
  14.         else:
  15.             return str(int(num[:i+1])-1) + '9'*(count-i-1)
  16.         #当依次从高位想低位推算,若最小值在该位置不是最小值,
  17.         #则该位置数字减1(1*该位置的位数)此位置之后全部用9取代

  18.     return int(num)<font color="Red"><b>#修改处</b></font>
复制代码


评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 01:04:27 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-29 04:44 编辑
kinkon 发表于 2020-3-28 21:17
上面的可能超时了,试试下面的

再优化一下
  1. def f361(n):
  2.     i=0
  3.     while list(str(n)) != sorted(str(n)):
  4.         i+=1
  5.         #这样的迭代不知道会不会在一个很大的数字中更具优势,因为是按照位数进行迭代   
  6.         n = (n//(10**i))*(10**i)-1
  7.     return n
复制代码
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 03:14:49 | 显示全部楼层
  1. def f361(n):
  2.     m=str(n)
  3.     l=len(m)
  4.     if l==1:
  5.         return n
  6.     for i in range(1,l):
  7.         if int(m[i])<int(m[i-1]):
  8.             if m[:i].count('9')<=1:
  9.                 return m[:i-1]+ str(int(m[i-1])-1)+'9'*(l-i)
  10.             else:
  11.                 j=m.index('9')
  12.                 return m[:j]+'8'+'9'*(l-j-1)
  13.     else:
  14.         return n
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 08:03:33 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 08:28:26 From FishC Mobile | 显示全部楼层
sYMMetrY 发表于 2020-3-29 01:04
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~

思路很不错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 10:09:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 10:58:57 | 显示全部楼层
  1. def f328(n):
  2.     if n<10:
  3.         return n
  4.     else:
  5.         s = '9'
  6.         while n >9:
  7.             a = n % 10
  8.             b = (n %100)//10
  9.             if a <b:
  10.                 s = s[0] + s
  11.                 n = n//10 - 1
  12.             else:
  13.                 s = str(a) +s
  14.                 n = n//10
  15.         s = str(n) + s
  16.         return int(s)//10
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 11:00:38 | 显示全部楼层
  1. def func(num):
  2.    
  3.    if int(num) < 10:
  4.       return True
  5.    
  6.    temp = list(num)
  7.    temp.reverse()

  8.    sec = int(temp.pop())
  9.    while len(temp) > 0:
  10.       first = sec
  11.       sec = int(temp.pop())
  12.       if first > sec :
  13.          return False
  14.    else:
  15.       return True

  16. n = input()

  17. while not func(n):
  18.    n = str( int(n) - 1 )

  19. print(int(n))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 11:10:59 | 显示全部楼层
本帖最后由 zltzlt 于 2020-3-30 13:24 编辑

我写的好难看
  1. def max_increase_num(num):
  2.     str_num = str(num)
  3.     length = len(str_num)
  4.     increase_str_num = ""
  5.     point = 0
  6.     for i in range(1, length):
  7.         if int(str_num[i-1]) > int(str_num[i]):
  8.             break
  9.         point += 1
  10.     while int(str_num[point - 1]) == int(str_num[point]) and point > 0 and point != length-1:
  11.         point -= 1
  12.     if point == length-1:
  13.         increase_str_num = str_num
  14.     elif point == 0:
  15.         increase_str_num = str(int(str_num[0]) - 1)
  16.     else:
  17.         increase_str_num = str_num[:point] + str(int(str_num[point])-1)
  18.     for i in range(point+1, length):
  19.         increase_str_num += "9"
  20.     return int(increase_str_num)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 14:17:37 | 显示全部楼层
  1. def daily361(num: int) -> int:
  2.     list_num = list(str(num))
  3.     max_index = 0
  4.     if len(list_num) == 1:  # 单数字一定满足题意
  5.         return num
  6.     for i in range(len(list_num)-1):
  7.         if list_num[i] < list_num[i+1]:
  8.             max_index = i+1
  9.         elif list_num[i] > list_num[i+1]:
  10.             list_num[max_index] = str(int(list_num[max_index])-1)
  11.             break
  12.     result = ''.join(list_num[:max_index+1]+['9'] * (len(list_num)-max_index-1))
  13.     return int(result)
复制代码


思路是从左往右找到下降前的最大数字位置(332的最大数字位置是第一个3),最大数字前面不变,最大数字自身减一,最大数字后面用9代替

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:18:23 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:18:48 | 显示全部楼层
本帖最后由 zltzlt 于 2020-3-29 17:35 编辑


40 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:26:06 | 显示全部楼层

60 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:27:09 | 显示全部楼层

输入 273070984 超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 17:28:05 | 显示全部楼层

晕,少了简单的判断。已改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:29:07 | 显示全部楼层
flamezyy 发表于 2020-3-28 20:12
有待优化,但脑子已经晕了

解答错误

输入:553776
输出:499
预期结果:499999
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:31:23 | 显示全部楼层
BngThea 发表于 2020-3-29 17:28
晕,少了简单的判断。已改


超时不是解答错误

超时意味着效率低
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:32:25 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 17:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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