力扣 - 剑指 Offer 45. 把数组排成最小的数
题目
思路1
- 将整数数组转化成字符串数组
- 然后使用Arrays工具类的sort方法帮助我们排序
代码
class Solution {
public String minNumber(int[] nums) {
int length = nums.length;
// 将整数数组转化成字符串数组
String[] str = new String[length];
for (int i = 0; i < length; i++) {
str[i] = String.valueOf(nums[i]);
}
// 使用Java自带排序
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o1+o2).compareTo(o2+o1);
}
});
// 将字符串数组里的按顺序拼接
StringBuilder sb = new StringBuilder();
for (String s : str) {
sb.append(s);
}
return sb.toString();
}
}
复杂度分析
- 时间复杂度:\(O(NlogN)\)
- 空间复杂度:\(O(N)\)
思路2
- 自定义排序规则
- 可以使用冒泡排序比较好理解一点,也可以使用快速排序
- 排序规则是这样的,通过拼接字符串拼接xy:
- 如果
x+y > y+x,那么说明x大于y - 如果
x+y < y+x,那么说明x小于y
- 如果
- 按照这个排序规则,可以得出类似升序排序,升序排序是前面的数字要小于后面的数字,这个题目也是要求前面的数字在该题环境下要小于后面的数字
- 因此我们可以得出以下代码:
代码
class Solution {
public String minNumber(int[] nums) {
int length = nums.length;
// 将整数数组转化成字符串数组
String[] str = new String[length];
for (int i = 0; i < length; i++) {
str[i] = String.valueOf(nums[i]);
}
// 自定义排序规则的快速排序
quickSort(str, 0, length-1);
// 将字符串数组里的按顺序拼接
StringBuilder sb = new StringBuilder();
for (String s : str) {
sb.append(s);
}
return sb.toString();
}
public void quickSort(String[] arr, int left, int right) {
String pivot = arr[(left + right) / 2];
int l = left;
int r = right;
while (l <= r) {
// 因为left+pivot要满足大于pivot+left,然后和右边的交换,这样子小的才能在左边
while ((arr[l] + pivot).compareTo(pivot + arr[l]) < 0) {
l++;
}
// 因为right+pivot要满足小于pivot+right,然后和左边的交换,这样子大的才能在右边
while ((arr[r] + pivot).compareTo(pivot + arr[r]) > 0) {
r--;
}
// 这一步进行交换,就是将大的移到右边,小的移到左边
if (l <= r) {
String temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
}
// 递归左边
if (r > left) {
quickSork(arr, left, r);
}
// 递归右边
if (l < right) {
quickSork(arr, l, right);
}
}
}
复杂度分析
- 时间复杂度:\(O(NlogN)\)
- 空间复杂度:\(O(N)\)
思路3
- 和思路2一样,也是使用快速排序,只是快速排序实现的方法不一样
代码
class Solution {
public String minNumber(int[] nums) {
int length = nums.length;
// 将整数数组转化成字符串数组
String[] str = new String[length];
for (int i = 0; i < length; i++) {
str[i] = String.valueOf(nums[i]);
}
// 快速排序
quickSork(str, 0, length-1);
// 将字符串数组里的按顺序拼接
StringBuilder sb = new StringBuilder();
for (String s : str) {
sb.append(s);
}
return sb.toString();
}
public void quickSork(String[] arr, int left, int right) {
if (left < right) {
int l = left;
int r = right;
String pivot = arr[l];
while (l < r) {
// 因为升序,所以right要大于pivot
while (l < r && (arr[r] + pivot).compareTo(pivot + arr[r]) >= 0) {
r--;
}
arr[l] = arr[r];
// 因为升序,所以left要小于于pivot
while (l < r && (arr[l] + pivot).compareTo(pivot + arr[l]) <= 0) {
l++;
}
arr[r] = arr[l];
}
arr[l] = pivot;
quickSork(arr, left, l-1);
quickSork(arr, l+1, right);
}
}
}
复杂度分析
- 时间复杂度:\(O(NlogN)\)
- 空间复杂度:\(O(N)\)
力扣 - 剑指 Offer 45. 把数组排成最小的数的更多相关文章
- 【Java】 剑指offer(45) 把数组排成最小的数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接 ...
- 剑指 Offer 45. 把数组排成最小的数
题目描述 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: ...
- 每日一题 - 剑指 Offer 45. 把数组排成最小的数
题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 快速排序 难易程度:中等 题目描述: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最 ...
- 剑指Offer:把数组排成最小的数【45】
剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...
- 【剑指Offer】把数组排成最小的数 解题报告(Python)
[剑指Offer]把数组排成最小的数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- Go语言实现:【剑指offer】把数组排成最小的数
该题目来源于牛客网<剑指offer>专题. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字 ...
- 《剑指offer》把数组排成最小的数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输 ...
- 《剑指offer》---把数组排成最小的数
本文算法使用python3实现 1 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组 $ [3,32,321] $ ,则打印出这 ...
随机推荐
- MySQL实战45讲(10--15)-笔记
11 | 怎么给字符串字段加索引? 维护一个支持邮箱登录的系统,用户表是这么定义的: mysql> create table SUser( ID bigint unsigned primary ...
- jenkins AWS CodeDeploy不停机部署
此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中.同时在java项目 ...
- 分布式消息流平台:不要只想着Kafka,还有Pulsar
摘要:Pulsar作为一个云原生的分布式消息流平台,越来越频繁地出现在人们的视野中,大有替代Kafka江湖地位的趋势. 本文分享自华为云社区<MRS Pulsar:下一代分布式消息流平台全新发布 ...
- Django使用富文本编辑器ckediter
1 - 安装 pip install django-ckeditor 2 - 注册APP ckeditor 3 - 由于djang-ckeditor在ckeditor-init.js文件中使用了JQu ...
- docker镜像与容器的导出导入
导入导出涉及的命令有save.load.export.import # 1) docker save 导出镜像到文件 docker save -o nginx.tar nginx:latest # 2 ...
- Servlet生命周期和方法
一.五个生命周期方法,有三个很重要,初始化方法.提供服务方法和销毁方法 1.三个主要方法 2.另外两个重写的成员方法只做了解 二.生命周期详解 其中,每次刷新页面都是一次对servlet访问: 页面访 ...
- 数组字符串json之间的相互转换
数组转字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...
- PHP方法的返回值
不仅是PHP,大部分编程语言的函数或者叫方法,都可以用return来定义方法的返回值.从函数这个叫法来看,本身它就是一个计算操作,因此,计算总会有个结果,如果你在方法体中处理了结果,比如进行了持久化保 ...
- php curl发送数据和文件
function mycurl($file, $url, $aid) { // 如果文件名是中文名,将中文字符编码转换一下 $file=iconv("UTF-8","gb ...
- php move_uploaded_file保存文件失败
move_uploaded_file保存失败后找错,先使用了try catch,但是没输出信息,才知道该函数在php中是警告属于error,不属于exeption,因此不能通过简单的if(!...)处 ...