先占楼。
本帖最后由 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-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 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
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~
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
一个账号 发表于 2020-3-28 20:51
0 算不算?
算
sYMMetrY 发表于 2020-3-29 01:04
这样优化是不是可以?看到了两个这样的解析步骤都是逐步迭代,想请教下~~
思路很不错
冬雪雪冬 发表于 2020-3-28 20:12
tql吧
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
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))
本帖最后由 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)
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代替
BngThea 发表于 2020-3-28 19:39
输入 120 超时
本帖最后由 zltzlt 于 2020-3-29 17:35 编辑
塔利班 发表于 2020-3-28 19:43
40 ms
TJBEST 发表于 2020-3-28 19:57
写个效率低的
60 ms
冬雪雪冬 发表于 2020-3-28 20:12
输入 273070984 超时
zltzlt 发表于 2020-3-29 17:18
输入 120 超时
晕,少了简单的判断。已改
flamezyy 发表于 2020-3-28 20:12
有待优化,但脑子已经晕了
解答错误
输入:553776
输出:499
预期结果:499999
BngThea 发表于 2020-3-29 17:28
晕,少了简单的判断。已改
是超时不是解答错误哦
超时意味着效率低
l0stparadise 发表于 2020-3-28 20:19
会超时