把数组排成最小的数
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
问题分析:
两种思路:
1,找出所有的可能排列,然后进行大小的比较
2,通过组合比较确定先后顺序,进行拼接
代码展示:
错误的代码
var numbers = [3,32,321];
function PrintMinNumber(numbers){
console.log("numbers:",numbers);
if(numbers.length === 0)
return ;
if(numbers.length === 1)
return numbers[0];
var res = numbers[0].toString();
console.log("最开始的res:",res)
for(let i=1;i<numbers.length;i++){
res = compare(numbers[i].toString(),res);
console.log("compare之后的res:",res);
}
return res;
}
function compare(num1,num2){
let s1 = num1+num2;
let s2 = num2+num1;
console.log(s1,s2);
return s1>s2?s2:s1;
}
PrintMinNumber(numbers);
- 这里我原来的想法是从前往后,两两组合比较,找出最小的,逐步拼接,忽略了先后顺序的问题
- 比如1 5 4 3 2 这些会因为操作的先后顺序报错
- 改进:先进行排序,将两两组合最大的那个放到最后面,然后排序完毕后 拼接输出
正确的代码
function PrintMinNumber(numbers)
{
//将数组先按照正确的顺序排列好,然后进行连接,
//所谓正确的顺序就是对于选取较小的值来说,按照原有顺序选取,可能会因为先后而造成大小不正确
if(numbers.length === 0)
return "";
if(numbers.length === 1)
return numbers[0];
//对数组排序
let sum1,sum2,tmp;
for(let i=0;i<numbers.length;i++){
for(let j=i+1;j<numbers.length;j++){
sum1 = parseInt(numbers[i].toString()+numbers[j].toString());
sum2 = parseInt(numbers[j].toString()+numbers[i].toString());
if(sum1>sum2){
tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
}
}
//连接所有数组元素
var res = "";
for(let i=0;i<numbers.length;i++){
res+=numbers[i].toString();
}
return res;
}