力扣 - 剑指 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] $ ,则打印出这 ...
随机推荐
- Mybatis(二)——全局配置文件
一.在正文上方直接添加目录. 1.二级标题***申请开通js权限 2.添加js脚本到页脚Html代码 数组:采用一段连续的存储单元来"存储"数据.对于"指定下标" ...
- 转:C# PDFbox读取PDF内容
using System; using System.Windows.Forms; using org.apache.pdfbox.pdmodel; using org.apache.pdfbox.u ...
- finally方法体
1.资源释放 java7可以在try(创建资源对象,方法体结束之后自动释放) 2.finally中有返回
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...
- Hearthbuddy跳过ConfigurationWindow窗口
Hearthbuddy版本为按照上一条博客修复后的版本. 打开Hearthbuddy后会弹出一个这样的窗口: 这个界面没有什么用,而且也没有人对此进行任何修改. 由于之前折腾版早就已经把这个界面跳过了 ...
- 模板引挚 jade ejs
// asl sum翡翠 后台使用如下: const jade = require('jade') //pretty 美化的意思,指的是渲染的布局会美化 2020-2-15 var str = j ...
- mac下secureCRT的使用技巧
1.设置secureCRT不掉线的方法 Options->Global Options->General->Default Session->Edit Default Sett ...
- Redis核心原理与实践--列表实现原理之quicklist结构
在上一篇文章<Redis列表实现原理之ziplist结构>,我们分析了ziplist结构如何使用一块完整的内存存储列表数据. 同时也提出了一个问题:如果链表很长,ziplist中每次插入或 ...
- ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. Android精进之路第一篇,确定安卓学习计划. 干货满满,建议收藏,需要用到时常看看.小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 ...
- 整理STC延时函数时遇到的玄学问题
void Delay { unsigned char i, j; i = 11; j = 190; do { while (--j); } while (--i); } void Delay { un ...