题目:

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]

输出: "102"

示例 2:

输入: [3,30,34,5,9]

输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

详情解释:可以看 K神老师以及评论区的题解

图片来源于 @K神老师

思路:

①首先将数组转换成字符串列表;

②基于快速排序的排序规则,对字符列表进行排序;

③拼接排序后的字符串,返回结果即可。

推荐看一下:博主codereasy的视频,看他的动画讲解的很清楚,然后再看代码就很好理解啦!

代码:

 1 class Solution {
2 public String minNumber(int[] nums) {
3 //将数组转换成字符串列表
4 String[] strs = new String[nums.length];
5 for(int i = 0; i < nums.length; i++){
6 strs[i] = String.valueOf(nums[i]);
7 }
8 //将字符串列表进行快速排序
9 quickSort(strs, 0, strs.length-1);
10 //将排序好的结果进行拼接并输出
11 StringBuffer sb = new StringBuffer();
12 for (String s: strs){
13 sb.append(s);
14 }
15 return sb.toString();
16 }
17 //定义快速排序方法
18 public void quickSort(String[] strs, int start, int end){
19 if (start < end){
20 //一轮排序后获取的中间位置
21 int middle = getMiddle(strs, start, end);
22 //这时候基准位置的左边都比它小,右边都比它大
23 //快排基准位置左边部分
24 quickSort(strs, start, middle - 1);
25 //快排基准位置右边的部分
26 quickSort(strs, middle + 1, end);
27 }
28 }
29 public int getMiddle(String[] strs, int left, int right){
30 //设置基准位置为第一个元素
31 String pivot = strs[left];
32 while(left < right){
33 //从右往左看
34 //小于等于0,代表式子中前面小于等于后面的,于是不交换
35 while(left < right && (pivot + strs[right]).compareTo(strs[right] + pivot) <= 0){
36 right--;
37 }
38 //上面循环不满足,代表需要移动后面的元素到前面
39 strs[left] = strs[right];
40 //从左往右看
41 while(left < right && (strs[left] + pivot).compareTo(pivot + strs[left]) <= 0){
42 left++;
43 }
44 //上面循环不满足,代表需要移动前面的元素到后面
45 strs[right] = strs[left];
46 }
47 //left = right,中间位置
48 //把基准元素放在这时的中间
49 strs[left] = pivot;
50 return left;
51 }
52 }

小知识:

compareTo:

str1.compareTo(str2):如果str1 < str2,就会返回负数,大于就会返回正数,等于返回0。

面试题45(Java)-把数组排成最小的数(中等)的更多相关文章

  1. 【Offer】[45]【把数组排成最小的数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组{3,32,321},则打印出 ...

  2. (剑指Offer)面试题33:把数组排成最小的数

    题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路: 1.全 ...

  3. 【剑指Offer学习】【面试题33:把数组排成最小的数】

    题目:输入一个正整数数组,把数组里全部数字拼接起来排成一个数.打印能拼接出的全部数字中最小的一个. 样例说明: 比如输入数组{3. 32, 321},则扫描输出这3 个数字能排成的最小数字321323 ...

  4. 《剑指offer》第四十五题(把数组排成最小的数)

    // 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3 ...

  5. 剑指Offer面试题33(java版):把数组排成最小的数

    题目:输入一个正整数数组.把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个.比如输入数组{3,32.321}.则打印出这3个数字能排成的最小数字321323. 这个题目最直接的做法应 ...

  6. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  7. 力扣 - 剑指 Offer 45. 把数组排成最小的数

    题目 剑指 Offer 45. 把数组排成最小的数 思路1 将整数数组转化成字符串数组 然后使用Arrays工具类的sort方法帮助我们排序 代码 class Solution { public St ...

  8. 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题

    题目地址:http://ac.jobdu.com/problem.php?pid=1504 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如 ...

  9. php实现把数组排成最小的数(核心是排序)(看别人的代码其实也没那么难)(把php代码也看一下)(implode("",$numbers);)(usort)

    php实现把数组排成最小的数(核心是排序)(看别人的代码其实也没那么难)(把php代码也看一下)(implode("",$numbers);)(usort) 一.总结 核心是排序 ...

  10. JZ-032-把数组排成最小的数

    把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...

随机推荐

  1. 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey

    为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...

  2. SQL语句之基础增删改查

    目录 插入:NSERT INTO 语句 删除:DELETE 语句 更新:UPDATE 语句 选择 SELECT 语句 SELECT DISTINCT 语句 相关子句.运算符.关键字 WHERE 子句 ...

  3. Python根据时间命名并创建文件源码

    自己写的,产品中验证ok的代码,直接上实例: import time def file_create_func(): loca = time.strftime('%Y-%m-%d-%H-%M-%S') ...

  4. ADS1299芯片datasheet 重点解析

    一 START和DRDY的关系 start必须要至少提前拉高2个时钟,才会产生DRDY信号,这个非常关键,也是重心所在.很多遗漏的就不会有DRDY信号出来了. 二 START和DRDY的时序图 sta ...

  5. .NET Aspire Preview 4 发布!

    .NET Aspire是一个有态度的云原生应用开发框架,旨在改善生成.NET云原生应用的体验,并提供一组强大的工具来帮助你生成和运行分布式应用.它允许开发者快速创建属于自己的云原生应用,或改造已有的项 ...

  6. 从零搭建react+ts组件库(二)less模块化与svg引入配置

    在上一篇<从零搭建react+ts组件库(一)项目搭建与封装antd组件>介绍了使用webpack来搭建一个基于antd的组件库的基本框架,但是作为一个组件库,实际上还有很多的都还未引入, ...

  7. 业务开发做到零 bug 有多难?

    大家好,我是树哥,好久不见啦. 作为一个工作了 10 多年的开发,写业务代码总是写了不少的.但你想过做到零 bug 吗?我可是想过的,毕竟我还是有点追求的.不然每天都是浑浑噩噩地过,多没意思啊. 大概 ...

  8. vector的Erase相关

    vector<int>Vect; Vect.insert(Vect.begin()+2, 50); for (auto it=Vect.begin();it!=Vect.end();++i ...

  9. 记录--vue3函数式弹窗

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面.如果每个页面都去 ...

  10. protected和private继承方式的不同

    环境:QT 5.12 继承方式规定了子类如何访问从基类继承的成员.继承方式有public.protected.private三种.继承方式不影响派生类的访问权限,影响了从基类继承而来的成员的访问权限, ...