博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指 Offer》——32、把数组排成最小的数
阅读量:2343 次
发布时间:2019-05-10

本文共 1106 字,大约阅读时间需要 3 分钟。

1. 本题知识点

数组

2. 题目描述

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

3. 解题思路

本题实际上希望我们找到一个排序规则,数组根据这个排序规则进行重排之后可以连成一个最小的数字。要确定这样的排序规则,也就是对于两个数字 m 和 n,通过一个规则确定哪个应排在前面。

根据题目要求,我们可以发现,两个数字 m 和 n 能拼接成 mn 和 nm,如果 mn<nm,那 m 应该在前;如果 nm<mn,那么 n 应该在前。因此,我们得到的排序规则如下:

  • 若 mn>nm,则 m 大于 n
  • 若 mn<nm,则 m 小于 n
  • 若 mn=nm,则 m 等于 n

根据上述规则,我们需要先把数字转换成字符串再进行比较,因为需要拼接起来。比较完之后按顺序连接成一个字符串即可。

4. 代码

public class Solution {
public String PrintMinNumber(int[] numbers) {
String result = ""; String[] str = new String[numbers.length]; // 将整数数组转换为字符串数组 for (int i = 0; i < numbers.length; i++) {
str[i] = String.valueOf(numbers[i]); } // 对字符串数组进行排序 Arrays.sort(str, new Comparator
() {
@Override public int compare(String m, String n) {
String mn = m + n; String nm = n + m; return mn.compareTo(nm); } }); // 最后拼接成一个字符串 for (String s : str) {
result += s; } return result; }}

转载地址:http://hbjvb.baihongyu.com/

你可能感兴趣的文章
视图包含下列结构是不可以更新的
查看>>
可能返回 null 的 SQL 语句
查看>>
以下关于STL的描述中,错误的有
查看>>
假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找5。下面____不可能是键的检查序列。
查看>>
给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
查看>>
设二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序____。
查看>>
将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是____。
查看>>
IP地址、子网掩码、网络号、主机号、网络地址、主机地址
查看>>
已知int a[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int **q=p;表达式*(p[0]+1)+**(q+2)的值是____。
查看>>
CPU输出数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用()
查看>>
整型字符常量和字符字面量的区别 sizeof(char) 和 sizeof('a')
查看>>
表的主键特点中,说法不正确的是()
查看>>
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
查看>>
冯诺依曼工作方式的基本特点是____
查看>>
下列关于文件索引结构的叙述中,哪些是正确的?
查看>>
虚拟存储的容量受到下列哪一个因素的限制影响最大?
查看>>
关于域名和IP描述正确的是?
查看>>
哪些字段适合建立索引?
查看>>
关于group by子句的作用描述正确的是?
查看>>
执行"int x=1;int y=~x;"语句后,y的值为?-----取反运算,补码
查看>>