新思路 | 另一个解法:数字拓展法
把数组排成最小的数
http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993
做完这道题,发现题解中没人尝试过将字符拓展,故分享我的思路。思路仅供参考,并非最优解
核心思路:如果所有数字的长度相等,那么直接排序即可。
为此,我们需要将原数组构造成每个元素长度相等的数组。
# 举个栗子 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