剑指offer45 把数组排成最小的数

这篇具有很好参考价值的文章主要介绍了剑指offer45 把数组排成最小的数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

链接

剑指offer45 把数组排成最小的数,日常算法,C++,算法,leetcode,贪心算法

其实这道题,大概看完就知道是一个排序的问题,无非就是数组中的元素以一个合适的位置排好序,这样从头加到尾,组成的整体数字最小!(题目中也暗示你排序问题了)

个人捉摸了一会,这道题能很好地锻炼仿函数的编写规则和库函数sort()的配套使用,还有就是巧妙地字符串操作和贪心思想,因此将它记录;


解法1,调用sort()

解题思路

核心: 怎么确定元素a,b的先后顺序?

贪心思想: 先将a,b两数字转成string,之后如果a+b<b+a**,那么**a就排在b前面,以此类推;

最终将排好序的每个数组转string全部从头到尾按顺序拼接即可;

实现代码

#include <string>
class Solution {
public:
    class cmp{
        public:
        bool operator()(int a,int b)
        {
            //先分别转正string
            string sa = to_string(a);
            string sb = to_string(b);
            
            return sa+sb<sb+sa;       
        }
    };
    string PrintMinNumber(vector<int> numbers) {
        //处理空串
        if(numbers.size()==0) return "";
        //按照贪心仿函数规则,调用sort
        sort(numbers.begin(),numbers.end(),cmp());

        //依次拼接最终答案
        string ret;
        for(auto&e:numbers){
            ret+=to_string(e);
        }
        return ret;
    }
};

这里要注意的点是我们调用库函数sort(),那么注意他的仿函数比较大小的规则:

源码如下:

剑指offer45 把数组排成最小的数,日常算法,C++,算法,leetcode,贪心算法

less<int>递增,如1,2,3,4,5: 仿函数源码: return a<b;

greater<int>递减,如5,4,3,2,1: 仿函数源码: return a>b;

调用sort()想要递增or递减完全是按照大于号或者小于号的方向指示的;

解法2,冒泡排序的扩展

可万一面试官突然不让你算法sort()函数了呢?不慌,贪心思想都想出来了,无非就是手撕一个排序嘛,量元素比较的时候套用我们的贪心思想比较即可!

实现代码

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
       //处理空串
        if(numbers.size()==0) return "";
        
		string res;
        //冒泡排序
        for(int i = 0; i < numbers.size() - 1; i++){
            for(int j = 0; j < numbers.size() - i - 1; j++){
                //数字转string好贪心处理
                string s1 = to_string(numbers[j]);
                string s2 = to_string(numbers[j+1]);
                
                //贪心比较拼接的大小交换位置
                if(s1+s2 > s2+s1)
                    swap(numbers[j], numbers[j + 1]);
            }
        }
        //字符串叠加返回
        for(int i = 0; i < numbers.size(); i++)
            res += to_string(numbers[i]);
        return res;
    }
};

这样写法我们就不用注意sort()库函数里的大于小于号的方向了,万全按照自己的逻辑进行比较即可,可以看到,我们交换时采用的是s1 > s2,而sort()方法中使用的则是<,这是因为人家sort()内部有自己的传参和比较的逻辑,我们不必太纠结,知道怎么正确用它就好!

这题的关键是贪心,可以好好品味字符串的魅力,不让用sort(),那可以手撕排序,比如冒泡,快排都往上写,尽情秀你的代码能力!文章来源地址https://www.toymoban.com/news/detail-794422.html

到了这里,关于剑指offer45 把数组排成最小的数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指offer面试题8 旋转数组的最小数字

    分析 首先一定要记住只要看到排序数组的查找,思维一定要往二分法上靠,然后再思考清楚如何利用二分法。而如何利用二分法一定要仔细分析所给的数组的特点:递增数组且最开始的若干元素搬到数组的末尾,相当于该数组由俩个递增小数组构成,前面的数组元素肯定大于

    2024年01月24日
    浏览(31)
  • 剑指 Offer 11. && LeetCode 154. 旋转数组的最小数字

    参考资料:LeetCode 官方解答 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素

    2024年02月09日
    浏览(32)
  • Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的

    2024年02月14日
    浏览(31)
  • 从零学算法(剑指 Offer 45)

    输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459” 我的原始人解法:直接冒泡排序,把最先应该拼接的那个数不断后移,然后拼接即可。关键就

    2024年02月10日
    浏览(24)
  • 【剑指 Offer 40】最小的k个数

    输入整数数组 arr ,找出其中最小的 k 个数。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。 示例: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 输入:arr = [0,1,2,1], k = 1 输出:[0] 找到一个数组中最小的 k 个数,得出要对该数组进行排序 排序

    2024年02月13日
    浏览(25)
  • 剑指 Offer 66. 构建乘积数组

    给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1] 。不能使用除法。 示例: 提示: 所有元素乘积之和不会溢出 32 位整数 a.length = 100000 解答

    2024年02月16日
    浏览(29)
  • 【剑指offer】数据结构——数组

    【剑指offer】03.数组中重复的数字 //03. 数组中重复的数字 // 找出数组中重复的数字。 // 力扣 // 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 // 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每 // 个数字重复了几次。请找出数组中任意一

    2024年02月08日
    浏览(31)
  • 剑指 Offer —— 数组和字符串

    在一个 n * m 的二维数组中: 每一行都按照从左到右 非递减 的顺序排序 每一列都按照从上到下 非递减 的顺序排序 请完成一个高效的函数,输入这样的一个 二维数组和一个整数 ,判断 数组中是否含有该整数 。 示例: 现有矩阵 matrix 如下: 给定 target = 5 ,返回 true 。 给定

    2023年04月24日
    浏览(35)
  • 剑指 Offer 66. 构建乘积数组(中等)

    题目: 作者:Krahets 链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/solutions/208840/mian-shi-ti-66-gou-jian-cheng-ji-shu-zu-biao-ge-fe/ 来源:力扣(LeetCode)

    2024年02月10日
    浏览(26)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包