做完这道题,发现题解中没人尝试过将字符拓展,故分享我的思路。思路仅供参考,并非最优解
核心思路:如果所有数字的长度相等,那么直接排序即可。
为此,我们需要将原数组构造成每个元素长度相等的数组。

# 举个栗子
origin = [1, 23, 125, 2245]
idea = [1xxx, 23xx, 125x, 2245]

那么我们的问题转换为:如何将数字长度拓展,且不影响原逻辑顺序?
不难发现,在这里我们是逐位进行比较大小的,跟hbase的key查询设计逻辑一致,那么不妨令[下一位] = [原数字最后一位]

# 举个栗子,可以看到比较结果没有被破坏
origin = [1, 23, 125, 2245]
>> sort : 1, 125, 2245, 23

idea = [1xxx, 23xx, 125x, 2245]

trans = [1111, 2333, 1255, 2245]
>> sort : 1111, 1255, 2245, 2333

(1)处理思路 为了令转换前和转换后一一对应,易想到使用字典,可以将转换关系存入字典,将转换后的结果排序,再从字典中逐个取出。

lst = dict()
sort, res = [], ''
while len(str(tmp)) < len(str(max(numbers))):
    tmp = tmp * 10 + tmp % 10

lst[tmp] = str(numbers[i])
sort.append(tmp)

(2)带来的问题 如果出现诸如 [A,AA]的形式,二者在字典中只能存一份

解决思路
a) 一开始想过,令重复项的key自增或自减,但显然会引入 0->9 和 9->0 的突变问题。
b) 直接将重复key的两数拼接,但如果数字为 [AB, ABB] 式,显然也不能满足所有情况。
c) 将 b) 的方法改进,先比较两项拼接结果,再插入字典

最后代码如下(python)

class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        lst = dict()
        sort, res = [], ''

        for i in range(len(numbers)):
            tmp = numbers[i]
            while len(str(tmp)) < len(str(max(numbers))):
                tmp = tmp * 10 + tmp % 10
            if tmp in lst:
                lst[tmp] = min(str(lst[tmp]) + str(numbers[i]), str(numbers[i]) + str(lst[tmp]))
            else:
                lst[tmp] = str(numbers[i])
                sort.append(tmp)
        sort.sort()
        for i in sort:
            res += lst[i]
        return res