(尊重劳动成果,转载请注明出处: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){
if(Integer.parseInt(s1+s2)>Integer.parseInt(s2+s1))
return true;
return false;
}
}
这里有个小问题,当输入的数字太大的时候,s1+s2是不可以直接转换为int类型,会报异常, 所以需要按位比较:
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;
else
return false;
}
答案是NO,如果写成了else形式,则如果某一位是 相等的,就不进行后边的判断,得出的新规则下的大小关系必然是错误的。
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。
欢迎关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~