《剑指offer》面试题45:把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,使其为所有可能的拼接结果中最小的一个。例如输入{3,32,321},则输入321323。


思路:

1.此题需要对数组进行排序,关键点在于排序的规则需要重新定义。我们重新定义“大于”,“小于”,“等于”。如果a,b组成的数字ab的值大于ba,则称a"大于"b,小于与等于类似。
2.比如3与32,因为332大于323,因此我们称3“大于”32。我们按照上述的“大于”,“小于”规则进行升序排列,即可得到题目要求的答案。

基于以上思路,java代码如下:

package chapter5;

import java.util.Arrays;
import java.util.Comparator;

public class P227_SortArrayForMinNumber {
    public static class MyComparator1 implements Comparator<Integer> {
        @Override
        public int compare(Integer a, Integer b) {

            return (a +""+ b).compareTo(b +""+ a);
        }
    }

    public static String sortarrayforminnumber1(int[] nums){
        if(nums==null||nums.length==0) return "";

        Integer[] data = Arrays.stream(nums).boxed().toArray(Integer[]::new);//int[]转Integer[]
        Arrays.sort(data,new MyComparator1());
        String res="";
        for(int i=0;i<data.length;i++){
            res+=data[i];
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(sortarrayforminnumber1(new int[]{3,32,321}));
    }
}

其中int[]转Integer[]相关的参考了Java中List,Integer,int数组相互转换

补充题目:给定一个字符串类型的数组strs, 找到一种拼接方式, 使得把所有字符串拼起来之后形成的字符串具有最低的字典序。

java参考代码如下:

package chapter5;

import java.util.Arrays;
import java.util.Comparator;

public class P227_SortArrayForMinNumber {
    public static class MyComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            return (a + b).compareTo(b + a);
        }
    }

    public static String sortarrayforminnumber(String[] strs){
        if(strs==null||strs.length==0) return "";

        Arrays.sort(strs,new MyComparator());
        String res="";
        for(int i=0;i<strs.length;i++){
            res+=strs[i];
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(sortarrayforminnumber(new String[]{"b","ba","bb","a"}));
    }
}

测试用例:

a.功能测试(输入的数组中有多个数字;输入的数组中数字有重复的数位;输入的数组中只有一个数字)。
b.特殊输入测试(表示数组的指针为nullptr指针)。

参考:

https://www.jianshu.com/p/3cead2821c68

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值