剑指 Offer 45. 把数组排成最小的数

    技术2022-07-10  94

    题目

    输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

    示例 1:

    输入: [10,2] 输出: "102" 示例 2:

    输入: [3,30,34,5,9] 输出: "3033459"

    思路

    每两个数逐个比较,如果两个数共有的高位能比较出大小,则比较成功,如23和221比较。否则得试着将两个数字拼接为相等长度。

    比较的方法:举例,320和32比较,应该解析为32032和32323比较(即不断循环原数字,直到两个数字长度之和)

    更简单的思路: 比较32032和32320(即直接比较两种可能的组合)

    代码

    class Solution { public String minNumber(int[] nums) { String[] s = new String[nums.length]; for(int i=0;i<s.length;i++){ s[i] = nums[i]+""; } for(int i=0;i<s.length;i++){ for(int j=i+1;j<s.length;j++){ if(bigger(s[i],s[j])){ String tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } } StringBuffer sb = new StringBuffer(); for(String str : s){ sb.append(str); } return sb.toString(); } public boolean bigger(String s1,String s2){ char c1='0',c2='0'; for(int i=0;i<s1.length()+s2.length();i++){ c1 = s1.charAt(i%s1.length()); c2 = s2.charAt(i%s2.length()); if(c1==c2) continue; if(c1>c2){ return true; }else{ return false; } } return false; } }

     

    Processed: 0.022, SQL: 9