• 面试题45:把数组排成最小的数(C++)


    题目地址:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/

    题目描述

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

    题目示例

    示例 1:

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

    示例 2:

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

    解题思路

    分析题目,数组排成最小的数的问题实质上是一个排序问题,所以,需要确定的是排序的规则。因为要排成最小的数,则对于两个数x、y,如果x + y < y + x,则x应该排在y之前;反之,若x + y > y + x,则y应排在x之前,比如x=3,y=30,则x + y = 330,而y + x = 303,基于排序规则可知,30应该排在3的前面,注意这里的x和y均是字符串,x + y实际上是将两个字符串拼接。另外需要注意的一点是排序规则compare必须是static,因为sort()函数的最后一个排序参数是指针,至于为什么呢?首先要明白静态成员函数和非静态成员函数的区别,静态成员函数属于类,非静态成员函数属于对象,非静态成员函数里的参数默认有this指针,但是sort函数里的排序规则,并不需要这个隐形参数,所以,把这个函数设置位static成员函数则没有this指针,参数和普通函数是一样的了。对于sort()函数而言,若compare返回为true,则会将compare的第一个参数放在左边,若compare返回false,则会将compare的第二个参数放在左边。所以,本题的解题步骤如下

    • Step1:利用to_string()方法将arr数组元素转换为字符串数组
    • Step2:使用C++自带排序算法sort()对数组进行排序,sort()函数排序规则我们自定义为s1 + s2 < s2 + s1;
    • Step3:返回最小数的结果

    程序源码

    class Solution {
    
    public:
        string minNumber(vector<int>& nums) {
            if(nums.size() == 0) return " ";
            string res = "";
            vector<string> arr;
            for(int i = 0; i < nums.size(); i++)
            {
                arr.push_back(to_string(nums[i])); //排序规则compare是string类型,故需要将nums转换成string
            }
            sort(arr.begin(), arr.end(), compare); //compare = [](string s1, string s2){return s1 + s2 < s2 + s1;}
            for(int j = 0; j < arr.size(); j++)
            {
                res += arr[j];
            }
            return res;
        }
         static bool compare(string &s1,string &s2)
            {
                return (s1 + s2 < s2 + s1);
        }
    };
    /*
    static bool compart(string x,string y){
      string s1 = x + y;
      string s2 = y + x;
      return s1 < s2;
    }
    */
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    Introduction to PostGIS 之加载shp数据
    缺陷管理总结篇
    对lIKE语句的优化
    数据库查询优化
    如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换
    加载启动目录以外的DLL(Assembley)的3种方法
    C#中使用windows medie player控件
    在Asp.net中使用多线程
    编程控制windows防火墙的exception list.
    读书笔记Win32多线程程序设计(1)
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12813735.html
Copyright © 2020-2023  润新知