当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)45.把数组排成最小的数

题目描述

剑指 Offer 45. 把数组排成最小的数

难度中等198收藏分享切换为英文接收动态反馈

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

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

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

测试用例

  • 功能测试(输入的数组中有多个数字;输入的素组中的数字有重复的数位;输入的数组中只有一个数字)
  • 特殊输入测试(输入数组的指针为空指针)

题目考点

  • 本题有两个难点:第一个难点是相处一种新的比较规则来排序一个数组;第二个难点是证明这个比较规则是有效的,并且证明根据这个规则排序之后,把数组中所有数字拼接起来得到的拼接起来得到的数字是最小的。这需要很强的数学功底和逻辑思维能力。
  • 考察应聘者解决大数问题的能力。应聘者在面试的时候要意识到,把两个int型的整数拼接起来得到的数字可能会超过int型数字能够表达的范围,从而导致数字溢出。我们可以用字符串表示数字,这样就能简洁地解决大数问题。

解题思路

可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在前面。

参考解题


public class Solution {

    /**
     * 新的排序规则解题
     * @param numbers
     * @return
     */
    public String printMinNumber(int [] numbers) {
        // 防止特殊输入
        if (numbers == null || numbers.length == 0) {
            return "";
        }
        // 以防两个数相加溢出,将int 变成 string
        String[] numberStrings = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            numberStrings[i] = numbers[i] + "";
        }

        // 利用新的排序规则排序
        Arrays.sort(numberStrings, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));

        StringBuilder result = new StringBuilder();

        for (String s : numberStrings) {
           result.append(s);
        }

        return result.toString();
    }
}

快排

class Solution {
    public String minNumber(int[] nums) {
        String[] strs = new String[nums.length];
        for(int i = 0; i < nums.length; i++)
            strs[i] = String.valueOf(nums[i]);
        quickSort(strs, 0, strs.length - 1);
        StringBuilder res = new StringBuilder();
        for(String s : strs)
            res.append(s);
        return res.toString();
    }
    void quickSort(String[] strs, int l, int r) {
        if(l >= r) return;
        int i = l, j = r;
        String tmp = strs[i];
        while(i < j) {
            while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;
            while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;
            tmp = strs[i];
            strs[i] = strs[j];
            strs[j] = tmp;
        }
        strs[i] = strs[l];
        strs[l] = tmp;
        quickSort(strs, l, i - 1);
        quickSort(strs, i + 1, r);
    }
}

相关文章:

  • 剑指Offer系列(java版,详细解析)46.把数字翻译成字符串
  • 剑指Offer系列(java版,详细解析)47.礼物的最大价值
  • 剑指Offer系列(java版,详细解析)48.最长不含重复字符的子字符串
  • 剑指Offer系列(java版,详细解析)49.丑数
  • 剑指Offer系列(java版,详细解析)50.第一个只出现一次的字符
  • 剑指Offer系列(java版,详细解析)51.数组中的逆序对
  • 剑指Offer系列(java版,详细解析)52.两个链表的第一个公共节点
  • 剑指Offer系列(java版,详细解析)53.在排序数组中查找数字
  • 剑指Offer系列(java版,详细解析)54.二叉搜索树的第K大的节点
  • 剑指Offer系列(java版,详细解析)55.二叉树的深度
  • 剑指Offer系列(java版,详细解析)56.数字中数字出现的次数
  • 剑指Offer系列(java版,详细解析)57.和为s的数字
  • 剑指Offer系列(java版,详细解析)58.翻转字符串
  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 2019.2.20 c++ 知识梳理
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Hibernate【inverse和cascade属性】知识要点
  • Java,console输出实时的转向GUI textbox
  • JS笔记四:作用域、变量(函数)提升
  • linux安装openssl、swoole等扩展的具体步骤
  • mac修复ab及siege安装
  • Python进阶细节
  • React Native移动开发实战-3-实现页面间的数据传递
  • ReactNative开发常用的三方模块
  • Redux系列x:源码分析
  • Terraform入门 - 3. 变更基础设施
  • 从零开始的无人驾驶 1
  • 缓存与缓冲
  • 检测对象或数组
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 微信开源mars源码分析1—上层samples分析
  • 原生Ajax
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 数论-逆元
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (0)Nginx 功能特性
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Python) SOAP Web Service (HTTP POST)
  • (编译到47%失败)to be deleted
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (四) 虚拟摄像头vivi体验
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .form文件_一篇文章学会文件上传
  • .NET : 在VS2008中计算代码度量值
  • .NET gRPC 和RESTful简单对比
  • .net 后台导出excel ,word
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET国产化改造探索(一)、VMware安装银河麒麟