首页 > 试题广场 >

把数组排成最小的数

[编程题]把数组排成最小的数
  • 热度指数:515796 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

数据范围:
0<=len(numbers)<=100
示例1

输入

[11,3]

输出

"113"
示例2

输入

[]

输出

""
示例3

输入

[3,32,321]

输出

"321323"
推荐

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        int n;
  String s="";
  ArrayList<Integer> list= new ArrayList<Integer>();
  n=numbers.length;
  for(int i=0;i<n;i++){
   list.add(numbers[i]);
   
  }
  Collections.sort(list, new Comparator<Integer>(){
  
  public int compare(Integer str1,Integer str2){
   String s1=str1+""+str2;
   String s2=str2+""+str1;
         return s1.compareTo(s2);
     }
  });
  
  for(int j:list){
   s+=j;
  }
        return s;

    }
}

编辑于 2015-06-19 17:37:53 回复(89)
function PrintMinNumber(numbers)
{
    // write code here
    numbers.sort((a, b)=>{
        if(parseInt(a+ ""+b) > parseInt(b+""+a)){
           return 1
           }else {
            return -1
        }
    })
    return numbers.join("")
}

发表于 2021-07-26 17:54:47 回复(0)
JS来啦~欢迎大家指教
function PrintMinNumber(numbers)
{
    let arr = numbers.sort((a,b)=>{
        a = a.toString().split('')
        b = b.toString().split('')
        let length = a.length>b.length?b.length:a.length;
        for(let i = 0;i<length;i++){
            let aa = a[i]
            let bb = b[i]
            if(aa !== bb) return bb - aa
        }
    })
    let res = ''
    for(let i = arr.length-1;i>=0;i--){
        res = res + arr[i]
    }
    return res
}
发表于 2021-06-02 10:59:42 回复(0)
[JavaScript] 使用内置的sort,提供新的排序方式
function PrintMinNumber(numbers)
{
    numbers.sort((num1,num2)=>{
        const combine1=`${num1}${num2}`;
        const combine2=`${num2}${num1}`;
        return combine1>combine2;
    })
    return numbers.join('');
}


发表于 2020-07-12 19:02:22 回复(0)
JS数组排序,一行代码:
function PrintMinNumber(numbers)
{
    return numbers.sort((a, b) => Number(a.toString() + b.toString()) - Number(b.toString() + a.toString())).join('');
}
function PrintMinNumber(numbers)
{
    return numbers.sort((a, b) => +(a + '' + b) - +(b + '' + a)).join('');
}



编辑于 2020-07-07 22:32:24 回复(0)
function PrintMinNumber(numbers)
{
    var str='';
    for(var i = 0; i<numbers.length;i++)
    {
        for(var j = i+1;j<numbers.length;j++)
        {
            var a = parseInt(numbers[i]+""+numbers[j])
            var b=  parseInt(numbers[j]+""+numbers[i])
            if(a > b)
            {
                var t = numbers[j];
                numbers[j] = numbers[i];
                numbers[i] = t;
            }
        }
    }
     return numbers.join('')
        
}


发表于 2020-03-28 21:39:01 回复(0)
JS一行搞定
function PrintMinNumber(numbers)
{
    return numbers.sort((a,b)=>+(a+''+b)-+(b+''+a)).join('');
}


编辑于 2020-03-23 17:17:33 回复(0)
主要是使用排序函数做比较,真是分分钟解决问题
function PrintMinNumber(numbers) {

numbers.sort((s1,s2)=>{
if(s1==s2) return 0;
else
return s1.toString()+s2.toString()>s2.toString()+s1.toString()?  1:-1;
})

return numbers.join('')
}
编辑于 2020-02-19 17:13:35 回复(0)
function PrintMinNumber(numbers)
{
    // write code here
    numbers.sort((m,n)=>{
        let a = `${m}${n}`;
        let b = `${n}${m}`;
        if(Number(a) > Number(b)){
            return 1;
        }else{
            return -1;
        }
    })
    return numbers.join('')
}

发表于 2019-10-13 15:43:52 回复(0)
numbers = numbers.sort((a, b) => {
        let as = a.toString(), bs = b.toString();
        let max = Math.max(as.length, bs.length);
        let index = as.length > bs.length ? bs.substring(bs.length - 1) : as.substring(as.length - 1);
        an = parseInt(as.padEnd(max, index));
        bn = parseInt(bs.padEnd(max, index));
        return an - bn
    });
    return numbers.join('')
发表于 2019-10-11 07:03:04 回复(0)
function PrintMinNumber(numbers)
{
    // write code here
    numbers.sort((a,b)=>{
        let p = (a + '').split('');
        let q = (b + '').split('');
        for(let i=0; i<p.length || i<q.length; i++){
            if(i === p.length){
                while(q[0] === q[i] && i < q.length-1){
                    q.shift();
                }
                return q[0] - q[i];
            }else if(i === q.length){
                while(p[0] === p[i] && i < p.length-1){
                    p.shift();
                }
                return p[i] - p[0];
            }else if(p[i] !== q[i]){
                return p[i] - q[i];
            }
        }
        return 0;
    })
    return numbers.join('');
}

发表于 2019-10-05 11:37:06 回复(0)
function PrintMinNumber(numbers)
{
    if(!numbers.length) return ''//空数组返回‘’
    //冒泡排序的思想
    for(var i=0;i<numbers.length-1;i++){
        for(var j=0;j<numbers.length-i-1;j++){
            //将比较的值转换成字符串
            var a=numbers[j].toString()
            var b=numbers[j+1].toString()
            while(a.length && b.length){
                //比较最高位,如果前面项比后面项要大,则交换位置
                if(a[0]>b[0]){
                    [numbers[j],numbers[j+1]]=[numbers[j+1],numbers[j]]
                    break;
                }
                //长度都为1的时候结束
                if(a.length==1 && b.length==1) break
                //去最高位后面的数,如果本身长度为1,则不变
                a=a.substring(1) || a
                b=b.substring(1) || b
            }
        }
    }
    return Number(numbers.join(''))
}

发表于 2019-10-03 20:42:17 回复(0)
语言:Javascript

function PrintMinNumber(numbers)
{
    var minNum = '';
    for(var i = 0; i < numbers.length; i++) {
        for(var j = i + 1; j < numbers.length; j++) {
            var a = numbers[i].toString() + numbers[j].toString();
            var b = numbers[j].toString() + numbers[i].toString();
           if(a > b) {
               var tmp = numbers[i];
               numbers[i] = numbers[j];
               numbers[j] = tmp;
            }
        }
    }
    for(var k = 0; k < numbers.length; k++) {
        minNum += numbers[k];
    }
    return minNum;
}

发表于 2019-09-13 19:00:03 回复(0)
function compare(a, b){
    var str1 = Number(a + "" + b);
    var str2 = Number(b + "" + a);
    if(str1<=str2){
        return -1
    }else{
        return 1
    }
}


function PrintMinNumber(numbers)
{
   if(numbers.length == 0){
       return ''
   }
    numbers.sort(compare)
    return Number(numbers.join(''))

}

发表于 2019-07-27 19:40:30 回复(0)
function PrintMinNumber(numbers) {
  if (!numbers.length) return [];
  const isLess = (n1, n2) => parseInt(`${n1}${n2}`) > parseInt(`${n2}${n1}`);
  return parseInt(numbers.sort(isLess).join(""));
}

JS代码,3行

编辑于 2019-07-20 13:56:37 回复(0)
function PrintMinNumber(numbers)
{
    // write code here
    var arr=numbers.map(function(a,key){
        return a.toString().split('');
    })
    arr.sort();
    var result=[];
    var larr=[];//临时数组
   // console.log(arr);
    for(var i=0;i<arr.length;i++){
        if(larr.length==0&&i==arr.length-1){
            result.push(arr[arr.length-1]);
        }
        if(larr.length==0){
            larr[0]=[...arr[i]];
        }else{
            if(arr[i][0]==larr[0][0]&&i!=arr.length-1){
                larr.push([...arr[i]]);
            }else{
                if(larr.length==1){
                    result.push([...larr[0]]);
                    result.push(arr[i]);
                    // console.log(result);
                    larr=[];
                }else{
                    if(i==arr.length-1){
                      larr.push([...arr[i]]);
                    }
                    let len=larr[0].length;
                    for(var ii=1;ii<larr.length;ii++){
                        if(len<larr[ii].length){
                            len=larr[ii].length;
                        }
                    }
                    for(var ii=0;ii<larr.length;ii++){
                        for(var l=larr[ii].length;l<len;l++){
                            larr[ii].push(larr[ii][0]);
                        }
                        larr[ii].push(ii);
                    }
                    larr.sort();
                    // console.log(larr);
                    for(var ii=0;ii<larr.length;ii++){
                        result.push(arr[larr[ii][larr[ii].length-1]]);
                    }
                    larr=[];
                }
            }
        }
       // console.log(larr,result);
    }
    return result.map(function(a,key){
      return a.join('');
    }).join('');
    }
发表于 2019-03-27 21:29:35 回复(0)
js  4行代码解决
function PrintMinNumber(numbers) {
  numbers = numbers.sort((numA, numB) => (numA + '' + numB) - (numB + '' + numA))
  return (numbers.length == 0) ? '' : Number(numbers.join(''))
}


编辑于 2019-02-17 16:39:34 回复(0)
function PrintMinNumber(numbers)
{
    return numbers.map(x=>x+'').sort((a,b)=>(a+b)-(b+a)).join('')
}

js 大法好, 一行就搞定
编辑于 2019-02-12 01:57:58 回复(1)
function PrintMinNumber(numbers)
{
    // write code here
    numbers.sort(function(a,b){
      return (a+""+b)-(b+""+a)
    })
    return numbers.join("")
}
发表于 2018-09-03 22:02:00 回复(0)
通过递推来分析:
1、数组只有两个数a,b时,组成两个数字ab,ba。比较ab和ba的大小,若ab>ba,则数组中a,b的位置互换;否则不改变。结果:数组中的数值依次相连,就是能组成的最小的数。
2、递推,当数组再增加数c时,则是在步骤1的基础上,依次比较两个相邻数可组成的数字的大小,来进行排序。

function compare(a,b){
    var ab = a+""+b;
    var ba = b+""+a;
    for(var i=0;i<ab.length;i++){
        if(ab.charAt(i) > ba.charAt(i)){
            return 1;
        }
        if(ab.charAt(i) < ba.charAt(i)){
            return -1;
        }
    }
    return 1;
}
function PrintMinNumber(numbers)
{
    numbers = numbers.sort(compare);
    var str="";
    for(var i=0;i<numbers.length;i++){
        str = str+numbers[i];
    }
    return str;
    
}


发表于 2018-05-29 13:29:14 回复(0)