社团活动每日一题:第十七天 把数组排成最小的数

本文介绍了作者在大学社团中遇到的一道LeetCode中等难度的编程题,涉及数字字符串的排序问题。作者通过延长数字字符串至最小公倍数并逐一比对的方法找到了解题规律,并实现了冒泡排序。虽然没有详细解释所有细节,但分享了思路和AC代码,适合有一定编程基础的读者参考。

前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。

题目链接icon-default.png?t=LA92https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/        社团首次布置难度为“中等”的题啊,折磨了我好久。

        看到题目后首先是蒙的,然后过了一段时间才反应过来要找规律,最后为了方便还硬去研究了一下struct,花了好长时间。

        这道题难点在找规律上,AC代码如下:

class Solution {
public:
    struct String {
        string s;
        bool operator < (const String& t) const {    //结构体重载运算符,十分推荐学一下
            string x = s,y = t.s;
            bool bo = y.size()<x.size();
            if(bo){string t = x;x = y;y = t;}
            int n = x.size(),m = y.size();
            for(int i=0,j=0; i<n||j<m ;i++,j++){     //最小公倍数
                i = i==n ? 0:i;
                j = j==m ? 0:j;
                if(x[i]!=y[j])return bo ^ x[i]<y[j];
            }
            return 0;
        }
    }a[101];
    void sort(int n){            //冒泡排序,Leecode用不了快速排序函数只能自己手写
        for(int i=1;i<n;i++){
            for(int j=i;j>0;j--){
                if(a[j]<a[j-1]){    //重构运算符后的结构体比较真的很方便
                    String t = a[j-1];
                    a[j-1] = a[j];
                    a[j] = t;
                }
            }
        }
    }
    string Set (int x){          //将数字转换成字符串,没啥好讲的,本人习惯用递归写
        string t = (x/10) ? Set(x/10):"";
        t += char(x%10 + '0');
        return t;
    }
    string minNumber(vector<int>& nums) {
        string ans="";
        int n = nums.size();
        for(int i=0;i<n;i++)a[i].s = Set(nums[i]);
            //建议养成for后一定加{}的习惯,我的码风不建议学
        sort(n);
        for(int i=0;i<n;i++)ans += a[i].s;
        return ans;
    }
};

        这里就不详细解释是怎么把数字转换成字符串和冒泡排序以及自定义结构体struct中operator的用法了,我来讲一下我找规律的思路:首先把两个数字字符串延长至它们长度的最小公倍数,然后一一比对,就可以得出谁的优先级更高了。这里数组的长度是n<=100,所以这个方法不会超时。那么为什么可以得出来这个规律呢?大家可以证明一下,本人高数证明题挂了所以这里不证明了(逃)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值