鱼C论坛

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

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

[复制链接]
发表于 2020-3-28 21:53:21 | 显示全部楼层
先占楼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

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

    return int(num)<font color="Red"><b>#修改处</b></font> 

评分

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

查看全部评分

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

使用道具 举报

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

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

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

使用道具 举报

发表于 2020-3-29 03:14:49 | 显示全部楼层
def f361(n):
    m=str(n)
    l=len(m)
    if l==1:
        return n
    for i in range(1,l):
        if int(m[i])<int(m[i-1]):
            if m[:i].count('9')<=1:
                return m[:i-1]+ str(int(m[i-1])-1)+'9'*(l-i)
            else:
                j=m.index('9')
                return m[:j]+'8'+'9'*(l-j-1)
    else:
        return n

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-29 08:03:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-3-29 10:09:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-29 10:58:57 | 显示全部楼层
def f328(n):
    if n<10:
        return n
    else:
        s = '9'
        while n >9:
            a = n % 10
            b = (n %100)//10
            if a <b:
                s = s[0] + s
                n = n//10 - 1
            else:
                s = str(a) +s
                n = n//10
        s = str(n) + s
        return int(s)//10

评分

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

查看全部评分

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

使用道具 举报

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

   sec = int(temp.pop())
   while len(temp) > 0:
      first = sec
      sec = int(temp.pop())
      if first > sec :
         return False
   else:
      return True

n = input()

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

print(int(n))

评分

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

查看全部评分

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

使用道具 举报

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

我写的好难看
def max_increase_num(num):
    str_num = str(num)
    length = len(str_num)
    increase_str_num = ""
    point = 0
    for i in range(1, length):
        if int(str_num[i-1]) > int(str_num[i]):
            break
        point += 1
    while int(str_num[point - 1]) == int(str_num[point]) and point > 0 and point != length-1:
        point -= 1
    if point == length-1:
        increase_str_num = str_num
    elif point == 0:
        increase_str_num = str(int(str_num[0]) - 1)
    else:
        increase_str_num = str_num[:point] + str(int(str_num[point])-1)
    for i in range(point+1, length):
        increase_str_num += "9"
    return int(increase_str_num)

评分

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

查看全部评分

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

使用道具 举报

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

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

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-29 17:18:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

晕,少了简单的判断。已改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

解答错误

输入:553776
输出:499
预期结果:499999
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


超时不是解答错误

超时意味着效率低
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 17:32:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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