一刷336-剑指 Offer 45. 把数组排成最小的数(m)

题目:
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
-----------------------
示例 :
输入: [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 类别中已经提供了将基本数据型态转换成 Stringstatic 方法 ,
也就是 String.valueOf() 这个参数多载的方法

有以下几种
(1String.valueOf(boolean b) :boolean 变量 b 转换成字符串
(2String.valueOf(char c) :char 变量 c 转换成字符串
(3String.valueOf(char[] data) :char 数组 data 转换成字符串
(4String.valueOf(char[] data, int offset, int count) :char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
(5String.valueOf(double d) :double 变量 d 转换成字符串
(6String.valueOf(float f) :float 变量 f 转换成字符串
(7String.valueOf(int i) :int 变量 i 转换成字符串
(8String.valueOf(long l) :long 变量 l 转换成字符串
(9String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
----------------------
class Solution {//面试时不建议使用
    public String minNumber(int[] nums) {
        String[] str = new String[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 = new StringBuilder();
        for (String s : str) {
            res.append(s);//将str变成一个字符串
        }
        return res.toString();//toString() 方法用于返回以一个字符串表示的 Number 对象值。
    }
}
-------------------------
(面试建议)快速排序:
需修改快速排序函数中的排序判断规则。字符串大小(字典序)对比的实现方法:
Java 中使用函数 A.compareTo(B)-------------
class Solution {//面试建议
    public String minNumber(int[] nums) {
        String[] str = new String[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 = new StringBuilder();//
        for (String s : str) {
            res.append(s);//将str拼接成一个字符串
        }
        return res.toString();//toString()方法用于返回一个字符串表示的Number对象值
    }
    public void quixkSort(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]) 左小右大
 */

LC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值