笔试-排列组合
应用
一个长度为[1, 50]、元素都是字符串的非空数组,每个字符串的长度为[1, 30],代表非负整数,元素可以以“0”开头。例如:[“13”, “045”,“09”,“56”]。
将所有字符串排列组合,拼起来组成一个新字符串,输出其中最小的数字:
如果是多位数字,优先选择不以“0”开头的最小数字;
如果新拼接的字符串都是以“0”开头,则选取最小的,并把开头部分的“0”去掉再输出;
如果是单位字符0,直接输出。
实现
strings = input("请输入若干个代表非负整数的字符串,可以以“0”开头,以空格分隔:").split()
array = []
for i in strings:
array.append(i)
# print(array)
def check_all_elements_start_with(list):
check_result = True
unnormal_num_sum = 0
for i in list:
if i[0] == "0":
unnormal_num_sum += 1
# 元素都是“0”开头
if unnormal_num_sum == len(list):
check_result = False
return check_result
def normalize(list):
# 每个字符串去除首位“0”
for i in list:
i[1:]
check_result = check_all_elements_start_with(list)
if check_result:
return list
else:
normalize(list)
def PaiLie_yu_ZuHe(list):
# 复制一下
l1 = list
# 去重
result = set()
# # 原始顺序加入到结果 # 测试几次发现多此一举
# string = ""
# for k in list:
# string = string + k
# result.add(string)
# 基于原始顺序,从左到右逐一交换位置:弟i个元素分别与后面的每个元素组成新字符串
for i in range(0, len(l1)-1):
for j in range(i+1, len(l1)):
temp = l1[i]
l1[i] = l1[j]
l1[j] = temp
string = ""
for k in l1:
string = string + k
result.add(string)
# 复原
l1 = list
# 基于原始顺序,从右到左逐一交换位置:弟i个元素分别与前面的每个元素组成新字符串
for i in range(1, len(l1)):
for j in range(0, i):
temp = l1[i]
l1[i] = l1[j]
l1[j] = temp
string = ""
for k in l1:
string = string + k
result.add(string)
# 复原
l1 = list
r = []
for i in result:
r.append(i)
# print(r)
return r
def filter_and_sort(list):
# 筛选不是“0”开头的元素,并int化
l = []
for i in A:
if i[0] != "0":
l.append(int(i))
l.sort()
return l
# PaiLie_yu_ZuHe(array)
# 单位字符串
if len(array) == 1:
check_result = check_all_elements_start_with(array)
if check_result:
# 字符串为正常数字
print(f"最小数字为{array[0]}")
else:
# 字符串为不正常数字
normalize(array)
print(f"最小数字为{array[0]}")
# 多位字符串
else:
A = PaiLie_yu_ZuHe(array)
check_result = check_all_elements_start_with(A)
if check_result:
# 字符串为正常数字
L = filter_and_sort(A)
print(f"最小数字为{L[0]}")
else:
# 字符串为不正常数字
B = normalize(A)
L = filter_and_sort(B)
print(f"最小数字为{L[0]}")
请输入若干个代表非负整数的字符串,可以以“0”开头,以空格分隔:08 10 2
最小数字为10082
请输入若干个代表非负整数的字符串,可以以“0”开头,以空格分隔:20 1
最小数字为120