蒋博文 发表于 2020-3-28 21:53:21

先占楼。

sjtuszy 发表于 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

sYMMetrY 发表于 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:
            i += 1
            numlist0 = numlist0
      #当数组中最小值与最高位数字一致,则往后推算,并以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>

sYMMetrY 发表于 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
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~

ouyunfu 发表于 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)<int(m):
            if m[:i].count('9')<=1:
                return m[:i-1]+ str(int(m)-1)+'9'*(l-i)
            else:
                j=m.index('9')
                return m[:j]+'8'+'9'*(l-j-1)
    else:
      return n

zltzlt 发表于 2020-3-29 08:03:33

一个账号 发表于 2020-3-28 20:51
0 算不算?

kinkon 发表于 2020-3-29 08:28:26

sYMMetrY 发表于 2020-3-29 01:04
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~

思路很不错

张林要努力啊 发表于 2020-3-29 10:09:09

冬雪雪冬 发表于 2020-3-28 20:12


tql吧

风魔孤行者 发表于 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 + s
                n = n//10 - 1
            else:
                s = str(a) +s
                n = n//10
      s = str(n) + s
      return int(s)//10

sharpEYEs 发表于 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))

旅途Z 发表于 2020-3-29 11:10:59

本帖最后由 zltzlt 于 2020-3-30 13:24 编辑

我写的好难看{:10_266:}
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) > int(str_num):
            break
      point += 1
    while int(str_num) == int(str_num) 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) - 1)
    else:
      increase_str_num = str_num[:point] + str(int(str_num)-1)
    for i in range(point+1, length):
      increase_str_num += "9"
    return int(increase_str_num)

March2615 发表于 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 < list_num:
            max_index = i+1
      elif list_num > list_num:
            list_num = str(int(list_num)-1)
            break
    result = ''.join(list_num[:max_index+1]+['9'] * (len(list_num)-max_index-1))
    return int(result)

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

zltzlt 发表于 2020-3-29 17:18:23

BngThea 发表于 2020-3-28 19:39


输入 120 超时

zltzlt 发表于 2020-3-29 17:18:48

本帖最后由 zltzlt 于 2020-3-29 17:35 编辑

塔利班 发表于 2020-3-28 19:43


40 ms

zltzlt 发表于 2020-3-29 17:26:06

TJBEST 发表于 2020-3-28 19:57
写个效率低的

60 ms

zltzlt 发表于 2020-3-29 17:27:09

冬雪雪冬 发表于 2020-3-28 20:12


输入 273070984 超时

BngThea 发表于 2020-3-29 17:28:05

zltzlt 发表于 2020-3-29 17:18
输入 120 超时

晕,少了简单的判断。已改

zltzlt 发表于 2020-3-29 17:29:07

flamezyy 发表于 2020-3-28 20:12
有待优化,但脑子已经晕了

解答错误

输入:553776
输出:499
预期结果:499999

zltzlt 发表于 2020-3-29 17:31:23

BngThea 发表于 2020-3-29 17:28
晕,少了简单的判断。已改

是超时不是解答错误哦

超时意味着效率低

zltzlt 发表于 2020-3-29 17:32:25

l0stparadise 发表于 2020-3-28 20:19


会超时
页: 1 [2] 3 4
查看完整版本: Python:每日一题 361