全排列
1.从后查看逆序区域,找到逆序区域的前一位,也即是数字交换的边界
2.让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置
3.把原来的逆序区域转为顺序状态
举例 1 2 4 5 3
找到逆序区域边界 5
交换 3 和5,得1 2 5 4 3
(交换的是逆序区域里面大于交换数****4 并且是最小,所以是5)
逆转逆序区域 得 125 3 4
def find_nearest_number(numbers = []):
# 1.从后查看逆序区域,找到逆序区域的前一位,也即是数字交换的边界
index = find_transter_point(numbers)
print(index)
# 如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数字
if index == 0:
return None
# 2.让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置
# 复制入参,避免直接修改入参
numbers_copy = numbers.copy()
exchange(index,numbers_copy)
# 3.把原来的逆序区域转为顺序状态
print(numbers_copy)
reverse(index, numbers_copy)
return numbers_copy
# 举例 1 2 3 5 4 函数找到的是i = 5
def find_transter_point(numbers = []):
for i in range(len(numbers) - 1, 0, -1):
if numbers[i] > numbers[i-1]:
return i
return 0
# 交换的是 3 和 5,4 里面大于3且最小的4
# 交换的是逆序区域的大于要交换的数字并且是逆序区域中最小的数字
def exchange(index, numbers = []):
head = numbers[index - 1]
for i in range(len(numbers) - 1, 0 , -1):
if head < numbers[i]:
numbers[index - 1] = numbers[i]
numbers[i] = head
break
# 列表逆序,i头,j尾巴
def reverse(index, numbers = []):
i = index
j = len(numbers) - 1
while i < j:
temp = numbers[i]
numbers[i] = numbers[j]
numbers[j] = temp
i += 1
j -= 1
return numbers
def output_number(number = []):
for i in number:
print(i, end ='')
print()
my_number = list([1,2,4,5,3])
for i in range(0,1):
my_number = find_nearest_number(my_number)
output_number(my_number)
print(reverse(0, [2,3,4,5,7]))