洛谷题解通道已经被关闭了,,,
先看到这题首先想到的就是排序,并非数字排序,而是以字符串的字典序排序。这种
规则里,'7' > '10',即从字符顺序从左往右开始逐个比较,遇见大的值就判断为整体值更大。
并且,如果从左往右的前面字符大小一样,则字符多的就大,所以'321' > '32'。
-----------------------------------------------------------------------------------------------------------------------
单纯的字典序排序不能解决问题,举个反例,arr = ['321','32'] 的时
候,'321'>'32',但是'32'放在前边才能凑出更大的数字'32321'。
当你从这个小小的反例出发,多写几个长度更长的反例,就可以总结出这么一个规律:
从左往右字符顺序逐个比较,短的字符进行循环比较,直到遇见大的值就判断为整体值更大
-----------------------------------------------------------------------------------------------------------------------
例如,'83' (左边的)与 '831296'(右边的)相比,要把 '83'放在前边,是因为他
们前两个字符相同,但是对于"**第三个字符**",左边进行循环判断,可以看作是
83838383...83的循环,那么第三个字符视为8,与右边的第三个字符1相比,左边的
更大,于是我们视作整体上左边的值更大。
-----------------------------------------------------------------------------------------------------------------------
写代码的时候重构一下sort()函数进行按照我们找到的规律进行排序,这题就解决了。
而循环部分我们使用取模运算,请参考代码:
import functools
n = int(input())
arr = list(map(str,input().split()))
def compare(a:str,b:str):
# 返回的结果从大到小进行排序
la = len(a)
lb = len(b)
for i in range(max(la,lb)): # 选择更大的长度才能遍历全部
# 使用取模运算,取模他们各自的长度,这样就更短的字符就能进入循环判断
if a[i%la] > b[i%lb]:return -1 # 视作 a 整体更大,排在前
if a[i%la] < b[i%lb]:return 1 # 视作 a 整体更小,排在后
return 0 # 视为 a == b ,这个时候肯定相等,谁前谁后无所谓
arr.sort(key=functools.cmp_to_key(compare)) # 重构sort() 函数的方式,传递compare函数为排序规则
for i in arr:print(i,end = '')