前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。
题目链接
https://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,所以这个方法不会超时。那么为什么可以得出来这个规律呢?大家可以证明一下,本人高数证明题挂了所以这里不证明了(逃)
本文介绍了作者在大学社团中遇到的一道LeetCode中等难度的编程题,涉及数字字符串的排序问题。作者通过延长数字字符串至最小公倍数并逐一比对的方法找到了解题规律,并实现了冒泡排序。虽然没有详细解释所有细节,但分享了思路和AC代码,适合有一定编程基础的读者参考。


被折叠的 条评论
为什么被折叠?



