题目:

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

示例 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. k8s是如何保障滚动升级时下线的pod不被访问

    Kubernetes (k8s) 通过一系列机制保障在滚动升级时,下线的 Pod 不再被访问.以下是一些主要的保障措施: Service 抽象:在 Kubernetes 中,Pod 通常不是直接暴露给 ...

  2. Android 混淆打包后gson报错Missing type parameter

    原文: Android 混淆打包后gson报错Missing type parameter - Stars-One的杂货小窝 记录一个简单的bug 在代码中使用了gson将json转为list: va ...

  3. leetcode数据库sql之Department Top Three Salaries

    leetcode原文引用: How would you print just the 10th line of a file? For example, assume that file.txt ha ...

  4. 记录--使用Canvas绘制一个验证码组件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用Canvas绘制一个验证码组件 前言 验证码,这一日常伴随我们的要素,是我们在线交互的重要安全保障.你的手机短信里是否被它占据半壁江山 ...

  5. 一个基于.NET Core构建的简单、跨平台、模块化的商城系统

    前言 今天大姚给大家分享一个基于.NET Core构建的简单.跨平台.模块化.完全开源免费(MIT License)的商城系统:Module Shop. 商城后台管理端功能 商品:分类.品牌.单位.选 ...

  6. GridSearch 最佳 estimator 设置问题

    GridSearchCV 最佳 estimator 设置问题 def train_model_Grid(estimator, param_grid, cv, X_train, X_test, y_tr ...

  7. Java内存马2-Spring内存马

    Spring内存马 目录 Spring内存马 1.Spring&Spring MVC简介 2.环境搭建 3.Controller内存马 4.踩坑日记 5.Interceptor内存马 1.Sp ...

  8. C++简单实现vector

    向量 向量是序列容器,表示可以更改大小的数组. 就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效.但与数组不同的是,它们的 ...

  9. .NET分布式Orleans - 9 - 贪吃蛇项目演示

    首先看完成效果 一个玩家的效果 多个玩家的效果 源码地址 https://gitee.com/chesterdotchen/snake-with-orleans 项目介绍 Snake.Common项目 ...

  10. #贪心#洛谷 6927 [ICPC2016 WF]Swap Space

    题目 分析 可以发现能将硬盘容量变大的优先,这种硬盘就是以格式化前的大小升序排序. 然后如果硬盘容量变小,那就是先填格式化后较大的硬盘(因为装完可以提供较大的空间) 代码 #include <c ...