32_PrintMinNumberFromAStringArr

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

思路:
本题考察字符串的比较。
string中的compareTo逻辑大概可以整理为:
1)字符串前面部分的每个字符完全一样,返回:后面两个字符串长度差;
如s1=ABC s2=ABCD返回 s1.compareTo(s2)为-1
2)字符串前面部分的每个字符存在不一样,返回:出现不一样的字符 ASCII 码的差值。
s1=BBC s2=ABCD 返回1,B比A大1
3)字符串的每个字符完全一样,返回 0;
本题要求串联后要小,就是s1+s2,和s2+s1中选择较小的那个,如果s2+s1更大,那么s1应该在前面。即按升序(按字ASCII 顺序)
小的排在前面。不能直接s1.compareTo(s2)!!!

package swordToOffer._32_PrintMinNumberFromAStringArr;

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

public class Solution {
    public String PrintMinNumber(int[] numbers) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < numbers.length; i++) {
            list.add(numbers[i]);
        }
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            /*
            返回负数代表o1<o2,o1位置在前;正数o1>o2,o1位置在后;0相等,位置不变;默认升序
             */
            public int compare(Integer o1, Integer o2) {
                String s1 = o1 + "" + o2;
                String s2 = o2 + "" + o1;
                //按字典顺序,如果s1>s2(说明o1的字典顺序在后,更大),
                // 返回正数,则o1>o2,o2排在o1前面(默认升序)
                return s1.compareTo(s2);
            }
        });
        String s = "";
        for (int num : list) {
            s += num;
        }
        return s;

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值