剑指offer-js 把数组排成最小的数

把数组排成最小的数

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值