Q33:把数组排成最小的数

publicclass Q33把数组排成最小的数 {
   /**
    * 题目:把数组排成最小的数
    * 题目说明:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数字{3,32,321},则打印出这3个数字能排成的最小数字321323
    * 解题思路:先比较两个数的组合情况,以及大小的比较情况。例如输入m和n,其组合情况为mn,nm
    * 1)如果mn <nm——>输出mn ——> m < n;
    * 2)如果nm <mn——>输出nm ——> n < m;
    * 3)如果mn =nm ——>输出任意一个 ——> m = n;
    * 注意:输入的m和n是正数,则它们的组合情况可能越界,因此要将其组合形式转换成字符串,然后比较组合字符串的大小,将小的字符串组合输出。
    */
   publicstatic void main(String[] args){
      Q33把数组排成最小的数 test = new Q33把数组排成最小的数();
      int[] array = {3,32,321};
      test.printMinNum(array);
   }
   publicvoid printMinNum(int[] array){
      int[] clone = array.clone();
      printMinNumber(clone, 0, clone.length-1);
      for(int i : clone)
         System.out.print(i);
   }
   privatevoid printMinNumber(int[] array,int start, int end) {//start和 end 是下标
      if(start < end){//起始点小于终止点时为空
         int number = array[end];//number中存放的是数组元素
         int small = start;//small表示下标,存放较小的数字
         for(int j = start; j < end; j++){
            //比较数组中两个元素的大小,判断String.valueOf(array[j])是否小于 String.valueOf(number)
            if(isSmall(String.valueOf(array[j]),String.valueOf(number))){//如果小于成立,则将较小的数存放到array[small]中
                int temp = array[j];
                array[j] = array[small];
                array[small] = temp;//较小的数存放到array[small]中
                small ++;
            }
         }
         array[end] = array[small];
         array[small] = number;
         printMinNumber(array, 0, small-1);//注意防止越界异常哦(-1)
         printMinNumber(array, small + 1, end);
      }
   }
   //比较两个字符串数字的大小
   privateboolean isSmall(String m, String n){//结果为false时,满足的是nm < mn(n < m);结果为true时,满足的是mn < nm (m < n)
      boolean result =false;
      String leftString =m+n;
      String rightString =n+m;
      for(int i = 0; i < leftString.length(); i++){
         if(leftString.charAt(i) <rightString.charAt(i)){//mn <nm
            returntrue;      
         }else {
            if(leftString.charAt(i) >rightString.charAt(i))//nm <mn
                returnfalse;
         }
      }
      return result;
   }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值