力扣 - 剑指 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] $ ,则打印出这 ...
随机推荐
- 超详细kafka教程来啦
Kafka的概念和入门 Kafka是一个消息系统.由LinkedIn于2011年设计开发. Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度O(1)的方式提供消息持 ...
- Python - 面向对象编程 - 实战(5)
前言 主要是针对静态方法.类方法.实例方法.类属性.实例属性的混合实战 需求 设计一个 Game 类 属性 定义一个类属性 top_score 记录游戏的历史最高分,这个属性很明显只跟游戏有关,跟实例 ...
- epoll经典代码示例
1. epoll原理 原理性的知识不再另做说明,我在这里附上收藏整理的两篇经典文章: select与epoll的本质关系. select.poll.epoll之间的区别. 2. epoll服务器端经典 ...
- python模块--calendar
方法 返回值类型 说明 .calendar(theyear, w=2, l=1, c=6, m=3) str 返回指定年份的年历, w: 每个日期的宽度, l: 每一行的纵向宽度, c: 月与月之间的 ...
- 有关类朋友圈设计(3) -- 数据库设计&现有技术&流程设计
在写之前,先说说当前的系统架构吧 spring cloud + zuul + eureka + oauth2 + redis + rabbitMq 这个系统是由我搭建的,当时采用的springClou ...
- 288 day05_异常,线程
day05 [异常.线程] 主要内容 异常.线程 教学目标 [ ] 能够辨别程序中异常和错误的区别 [ ] 说出异常的分类 [ ] 说出虚拟机处理异常的方式 [ ] 列举出常见的三个运行期异常 [ ] ...
- 机器学习——支持向量机SVM
前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...
- c++ 打包函数教程
c++当要重复运行一些代码时可以打包一个函数 当没有返回值时用void打包函数: #include <iostream> #include <stdio.h> using na ...
- webpack learn1-初始化项目1
使用Visual Studio Code软件使用准备,先安装一些插件,加快开发效率(还有Language Packs 选择简体中文安装后重启软件,可切换为中文): 下面是项目初始化步骤: 1 软件打 ...
- DISCUZ论坛添加页头及页尾背景图片的几种方法
先给大家分享页头添加背景图片的两种方法:1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<h ...