算法学习之把数组排成最小的数

题目描述

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

上来直接干也行,但是好像别人的技巧更秒:即a+""+b与b+""+a比较,如果a+""+b>b+""+a,则a该跟b换换位置了。

import java.util.ArrayList;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
      if(numbers==null||numbers.length<=0) return "";
      for(int i =0; i<numbers.length;i++){
          for(int j = i+1;j<numbers.length;j++){
              int sum1 = Integer.valueOf(numbers[i]+""+numbers[j]);
              int sum2 = Integer.valueOf(numbers[j]+""+numbers[i]);
              if(sum1>sum2){
                  int tem = numbers[i];
                  numbers[i] = numbers[j];
                  numbers[j] = tem;
              }
          }
      }
      // 这里最好使用StringBuilder拼接,因为用字符串累加其实最终调用的也是new StringBuilder,会new很多无用的对象
      StringBuilder str = new StringBuilder();
      for(int i = 0;i<numbers.length;i++){
          str.append(numbers[i]);
      }  
      return str.toString();
    }
}
  • 时间复杂度:O(nlogn)。
  • 空间复杂度:O(n)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值