题目:
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
-----------------------
示例 :
输入:[10,2]
输出:"102"
输入:[3,30,34,5,9]
输出:"3033459"
提示:0< nums.length <=100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0-----------------------
思考:
此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums中任意两数字的字符串为 x 和 y ,
则规定 排序判断规则 为:
若拼接字符串 x + y > y + x ,则 x “大于” y ;
反之,若 x + y < y + x,则 x “小于” y ;
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
根据以上规则,套用任何排序方法对 nums执行排序即可。
算法流程:
初始化: 字符串列表 strs ,保存各数字的字符串格式;
列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
返回值: 拼接 strs 中的所有字符串,并返回。
----------------
复杂度分析:
时间复杂度 O(NlogN) : N 为最终返回值的字符数量( strs 列表的长度≤N );
使用快排或内置函数的平均时间复杂度为 O(NlogN) ,最差为 O(N^2)
空间复杂度 O(N) : 字符串列表 strs占用线性大小的额外空间。
---------------------
内置函数:
需定义排序规则:
Java 定义为 (x, y)->(x + y).compareTo(y + x) ;
-------------------String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 ,
也就是 String.valueOf() 这个参数多载的方法
有以下几种
(1)String.valueOf(boolean b): 将 boolean 变量 b 转换成字符串
(2)String.valueOf(char c): 将 char 变量 c 转换成字符串
(3)String.valueOf(char[] data): 将 char 数组 data 转换成字符串
(4)String.valueOf(char[] data,int offset,int count): 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
(5)String.valueOf(double d): 将 double 变量 d 转换成字符串
(6)String.valueOf(float f): 将 float 变量 f 转换成字符串
(7)String.valueOf(int i): 将 int 变量 i 转换成字符串
(8)String.valueOf(long l): 将 long 变量 l 转换成字符串
(9)String.valueOf(Object obj): 将 obj 对象转换成 字符串, 等于 obj.toString()----------------------classSolution{//面试时不建议使用publicStringminNumber(int[] nums){String[] str =newString[nums.length];//创建字符串数组for(int i =0; i < nums.length; i++){//将整数数组转化为字符串数组
str[i]=String.valueOf(nums[i]);//String.valueOf(int i) : 将 int 变量 i 转换成字符串}Arrays.sort(str,(x, y)->(x + y).compareTo(y + x));//定义排序规则,已排序好StringBuilder res =newStringBuilder();for(String s : str){
res.append(s);//将str变成一个字符串}return res.toString();//toString() 方法用于返回以一个字符串表示的 Number 对象值。}}-------------------------(面试建议)快速排序:
需修改快速排序函数中的排序判断规则。字符串大小(字典序)对比的实现方法:
Java 中使用函数 A.compareTo(B);
-------------classSolution{//面试建议publicStringminNumber(int[] nums){String[] str =newString[nums.length];//创建字符数组for(int i =0; i < nums.length; i++){//将整数数组转化为字符串数组
str[i]=String.valueOf(nums[i]);//String.valueOf(int i):将int变量i转换为字符串}quixkSort(str,0, str.length -1);//使用快排StringBuilder res =newStringBuilder();//for(String s : str){
res.append(s);//将str拼接成一个字符串}return res.toString();//toString()方法用于返回一个字符串表示的Number对象值}publicvoidquixkSort(String[] str,int left,int right){//快排if(left >= right)return;//特判int i = left, j = right;String temp = str[i];//创建字符串临时变量while(i < j){//循环条件while(i < j &&(str[j]+ str[left]).compareTo(str[left]+ str[j])>=0) j--;while(i < j &&(str[i]+ str[left]).compareTo(str[left]+ str[i])<=0) i++;
temp = str[i];//不满足循环条件,i,j交换
str[i]= str[j];
str[j]= temp;}
str[i]= str[left];//交换str[i] 与 str[left]
str[left]= temp;quixkSort(str, left, i -1);//继续递归quixkSort(str, i +1, right);//继续递归}}/**
while (i < j && (str[j] + str[left]).compareTo(str[left] + str[j]) >= 0) j--;
(str[j] + str[left]):(str[left] + str[j])左大右小
---------
while (i < j && (str[i] + str[left]).compareTo(str[left] + str[i]) <= 0) i++;
(str[i] + str[left]):(str[left] + str[i]) 左小右大
*/