选择题
考察计算机基础知识
算法与数据结构:排序算法
数据库:索引
操作系统:死锁
计算机网络:应用层协议
编程题
转驼峰命名
略
上一个排列
给定一个正整数,范围可能超过64位整数范围,位数不超过1000,将其组成数字重新排列,求比其小的最大整数?如果结果位数与其不一致,或者不存在,则返回0。
- 输入描述
整数n - 输出描述
比n小的最大整数 - 示例
10
0
3798322211
3798322121
解释:case1,重新排列后的最大整数为1,与10位数不一致,故返回0。
类似题下一个排列,时间复杂度为 O ( N ) O(N) O(N)。
line = input().strip()
line = [val for val in line]
# 从右向左找到拐点
for i in range(len(line)-2, -1, -1):
if int(line[i]) > int(line[i+1]):
break
if i >= 0:
# 从右向左找到比拐点值小的最大数字,并交换位置
for j in range(len(line)-1, i, -1):
if int(line[i]) > int(line[j]):
line[i], line[j] = line[j], line[i]
break
# 拐点后逆序,变成降序排列
left, right = i+1, len(line)-1
while left < right:
line[left], line[right] = line[right], line[left]
left += 1
right -= 1
res = "".join(line)
if res[0] == '0':
print(0)
else:
print(res)
else:
print(0)