最近在刷算法笔试题,遇到这样一道题:
设有N个正整数,将它们连接成一排,组成一个最小的多位整数。
问题分析:
1、要保证连接的多位整数最小,这就需要比较N个整数的各个位数。另外考虑到最终结果是这些数的连接。首先,将这些数转化为字符串,更容易操作。
2、接下来考虑的是这些字符串的排序问题,也就是如何确定两个整数的字符串的前后位置。
首先考虑简单的情况:23和32,肯定23在前,32在后,组成的数更小。因此,相同位数的整数,较小的数排在前;
接下来,考虑不相同位数的数:
(1) 23和221,先看前两位,221较小,因此排在前面;
(2) 23和231,前两位相同。组成的数字23|231和231|23的前两位也相同,关键是第3位,也就是231中的最高位和第3位,最高位大于第三位,因此231排在前,才能保证第三位为1
(3) 同理,23和234,234的的最高位小于第三位,因此234排在后面,23|234更小。
基于以上的规律,现给出具体的算法(C++实现)
#include<iostream>
#include<stdlib.h>
#include<string.h>