题目描述(题目链接)
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
求解思路
重新定义一个比较字符串s1和s2大小的函数:从高位到低位依次比较,要注意的是前面几位都相等的情况(如3和30,432和43234,111311和1113)
调用上面的函数,并对数组冒泡排序,大的放在前面,小的放在后面,最后把数组中的字符串连接起来就是答案。
代码
class Solution {
public String largestNumber(int[] nums) {
int n = nums.length;
String result="";
String[] snums = new String[n];
int zero = 0;
for(int i=0;i<n;i++){ //把int数组转化为为string数组
snums[i] = Integer.toString(nums[i]);
if(nums[i]==0) zero++;
}
if(zero==n) return "0"; //处理全为0的特殊情况
for(int i=0;i<n-1;i++){ //冒泡排序,从大到小
for(int j=0;j<n-1-i;j++){
int co = compare(snums[j],snums[j+1]); //比较两个字符串的大小
if(co==-1){
String tmp = snums[j];
snums[j] = snums[j+1];
snums[j+1] = tmp;
}
}
}
for(int i=0;i<n;i++){
result += snums[i]; //连接每个字符串
}
return result;
}
int compare(String s1,String s2){ //返回1表示s1>s2,返回-1表示s1<s2
int n = s1.length();
int m = s2.length();
int i=0;
for(;i<Math.max(n,m);i++){
if(s1.charAt(i%n)>s2.charAt(i%m)) return 1; //比较相同位的大小
else if(s1.charAt(i%n)<s2.charAt(i%m)) return -1;
}
if(i%m!=0){ //s2还有剩余字符
if(s1.charAt(0)>s2.charAt(i%m)) return 1;
else return -1;
}
if(i%n!=0){ //s1还有剩余字符
if(s1.charAt(i%n)>=s2.charAt(0)) return 1;
else return -1;
}
return 0;
}
}
改进方法及代码
刚开始还是想复杂了!!
算法步骤
- 将int数组转化为string数组
- 使用sort方法排序,重写sort函数,直接比较s1+s2和s2+s1对应的数值大小就行(这里的“+”代表字符串连接)
- 将string数组中的字符串连接起来
知识点:
- 关于Array.sort()的排序算法:
参考:
Java的Arrays.sort()方法到底用的什么排序算法
浅谈Arrays.sort()原理
- 重写sort函数(要重写sort函数一定要是对象数组,如只能是Integer不能是int)
Comparable接口: 重写compareTo()函数
package java.lang;
import java.util.*;
public interface Comparable {
public int compareTo(T o);
}
Comparator接口: 重写compare()函数
package java.util;
public interface Comparator {
int compare(T o1, T o2);
boolean equals(Object obj);
}
- 字符串比较是否相同要用str1.equals(str2)
equals()比较的是对象的内容(区分字母的大小写格式)
“==”比较两个对象时,比较的是两个对象的内存地址
所以不相等。即使它们内容相等,但是不同对象的内存地址也是不相同的。
代码
class Solution {
public String largestNumber(int[] nums) {
int n = nums.length;
String result="";
String[] snums = new String[n];
for(int i=0;i<n;i++){ //转化成string数组
snums[i] = Integer.toString(nums[i]);
}
Arrays.sort(snums,(x,y)->{ //重写sort,排序
return -(x+y).compareTo(y+x);
});
if(snums[0].equals("0")) return "0"; //特殊情况全为0
for(int i=0;i<n;i++) result += snums[i]; //拼接
return result;
}
}