剑指Offer(第二版)面试题45:把数组排成最小的数

来源:互联网 发布:数据变异程度 编辑:程序博客网 时间:2024/06/06 20:56


(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73658227冷血之心的博客)



剑指Offer(第二版)面试题45:把数组排成最小的数


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



思路:我们需要定义一种新的比较大小规则,数组根据这个规则可以排成一个最小的数字。

排序规则:两个数字m和n,我们比较mn和nm的大小,来确定在新的比较规则下n和m的大小关系,来确定哪个应该排在前面


步骤:

  • 将整型数组转换为String数组
  • 在新的规则下对数组进行排序(本例使用了选择排序)


牛客网AC代码如下:

import java.util.ArrayList;public class Solution {    public String PrintMinNumber(int [] num) {if(num==null||num.length==0)            return "";int len = num.length;        String[] str = new String[len];        for(int i = 0; i < len; i++){            str[i] = String.valueOf(num[i]);        }        for (int i = 0; i < str.length; i++) {        for (int j = i+1; j < str.length; j++) {if(compare(str[i], str[j])){String temp = str[j];str[j] = str[i];str[i] = temp;}}}        StringBuilder sb = new StringBuilder();        for(int i = 0;i<str.length;i++){        sb = sb.append(str[i]);        }        return sb.toString();           }    private boolean compare(String s1,String s2){    int len = s1.length()+s2.length();    String str1 = s1+s2;    String str2 = s2+s1;    for (int i = 0; i < len; i++) {if(Integer.parseInt(str1.substring(i,i+1))>Integer.parseInt(str2.substring(i,i+1)))return true;if(Integer.parseInt(str1.substring(i,i+1))<Integer.parseInt(str2.substring(i,i+1)))return false;}return false;            }}


关于compare方法,在for循环中,是否可以表达成这样的形式?

for (int i = 0; i < len; i++) {if(Integer.parseInt(str1.substring(i,i+1))>Integer.parseInt(str2.substring(i,i+1)))return true;elsereturn false;}
答案是NO,如果写成了else形式,则如果某一位是 相等的,就不进行后边的判断,得出的新规则下的大小关系必然是错误的。



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~



本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。









阅读全文
2 1
原创粉丝点击