【剑指offer】把数组排成最小的数

来源:互联网 发布:局域网打印机端口 编辑:程序博客网 时间:2024/06/11 18:14

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

分析:题目要求比较整数数组组成后的数的大小,在int及long中来处理很容易超出范围,实际上大数问题一般放在字符串中来处理。我们把数组元素两两比较,比较的方法是两个数a、b,若ab>ba,就规定a>b,否则a<b;用这种方法把数组按从小到大的顺序排列并保存到字符串中。

string PrintMinNumber(vector<int> numbers) {if (numbers.empty()) return "";if (numbers.size() == 1)  return to_string(numbers.back());string res = "";int i = 0;while (i < numbers.size() - 1){  //只需确定n-1个位置的值;int j = i + 1,k=i;while (j < numbers.size()){  //k保存从数组下标i之后的"最小值"下标;string ab = to_string(numbers[k]) + to_string(numbers[j]);string ba = to_string(numbers[j]) + to_string(numbers[k]);if (ab>ba) k = j;j++;}swap(numbers[i], numbers[k]);    res += to_string(numbers[i]);i++;}res += to_string(numbers.back());  return res;}

原创粉丝点击