给定数字的最小排列
Smallest permutation of given number
我有一个数字作为字符串,我想找到由原始数字组成的最小数字,即
56340902138765401345 -> 10001233344455566789
我正在将字符串转换为列表并对其进行排序。
num = '56340902138765401345'
a = list(num)
a.sort()
由于数字不能以零开头(但我需要使用原始数字中的零)我正在寻找第一个非零元素并将其放在前面:
inext = next(i for i, x in enumerate(a) if x != '0')
a.insert(0, a.pop(inext))
然后我将列表转换回字符串并显示它。
num2 = ''.join(map(str, a))
print(num2)
它可以工作,但对我来说似乎不是很 pythonic 或优雅。有没有更好的方法?
我们可以数零。然后我们从数字中删除零,我们对其进行排序并重新组合。要重新组合,我们使用第一个数字,然后我们加回我们的零,然后是我们排序后的数字的其余部分。
num = '56340902138765401345'
nzeros = num.count('0')
num = ''.join(sorted(num.replace('0', '')))
print num[0] + ('0' * nzeros) + num[1:]
结果:
10001233344455566789
有几个小问题可以改进。
a = list(num)
a.sort()
可以替换为
a = sorted(num)
可以使用 ''.join(sorted(num)
从列表中重构字符串。
将它们放在一起,您可以使用正则表达式将前导零移到第一个非零数字后面:
import re
a = re.sub(r'^(0+)(.)', r'', ''.join(sorted(num)))
我不认为这更像 Pythonic,但它非常简洁,而且可能更优雅(这取决于旁观者)。
怎么样
num = "".join(sorted(num))
nonzero = num.rfind("0") + 1
if nonzero:
num[0] = num[nonzero]
num[nonzero] = "0"
如果 num 中没有 "0"
,则 rfind
return -1
,因此 nonzero
的计算结果为 False
。
def Function():
num=int(input("Enter your number: "))
num1=str(num)
list1=[]
count1=0
for i in num1:
if i == "0":
count1 += 1
else:
list1.append(int(i))
list1.sort()
s = ""
if count1 > 0:
for i in range(len(list1)):
if i == 0:
s += str(list1[i])
for j in range(count1):
s += "0"
else:
s += str(list1[i])
else:
for i in list1:
s += str(i)
print(int(s))
if __name__=="__main__":
Function()
我有一个数字作为字符串,我想找到由原始数字组成的最小数字,即
56340902138765401345 -> 10001233344455566789
我正在将字符串转换为列表并对其进行排序。
num = '56340902138765401345'
a = list(num)
a.sort()
由于数字不能以零开头(但我需要使用原始数字中的零)我正在寻找第一个非零元素并将其放在前面:
inext = next(i for i, x in enumerate(a) if x != '0')
a.insert(0, a.pop(inext))
然后我将列表转换回字符串并显示它。
num2 = ''.join(map(str, a))
print(num2)
它可以工作,但对我来说似乎不是很 pythonic 或优雅。有没有更好的方法?
我们可以数零。然后我们从数字中删除零,我们对其进行排序并重新组合。要重新组合,我们使用第一个数字,然后我们加回我们的零,然后是我们排序后的数字的其余部分。
num = '56340902138765401345'
nzeros = num.count('0')
num = ''.join(sorted(num.replace('0', '')))
print num[0] + ('0' * nzeros) + num[1:]
结果:
10001233344455566789
有几个小问题可以改进。
a = list(num)
a.sort()
可以替换为
a = sorted(num)
可以使用 ''.join(sorted(num)
从列表中重构字符串。
将它们放在一起,您可以使用正则表达式将前导零移到第一个非零数字后面:
import re
a = re.sub(r'^(0+)(.)', r'', ''.join(sorted(num)))
我不认为这更像 Pythonic,但它非常简洁,而且可能更优雅(这取决于旁观者)。
怎么样
num = "".join(sorted(num))
nonzero = num.rfind("0") + 1
if nonzero:
num[0] = num[nonzero]
num[nonzero] = "0"
如果 num 中没有 "0"
,则 rfind
return -1
,因此 nonzero
的计算结果为 False
。
def Function():
num=int(input("Enter your number: "))
num1=str(num)
list1=[]
count1=0
for i in num1:
if i == "0":
count1 += 1
else:
list1.append(int(i))
list1.sort()
s = ""
if count1 > 0:
for i in range(len(list1)):
if i == 0:
s += str(list1[i])
for j in range(count1):
s += "0"
else:
s += str(list1[i])
else:
for i in list1:
s += str(i)
print(int(s))
if __name__=="__main__":
Function()