一、把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
提示:
0 < nums.length <= 100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
解题思路:
1.求最小数,可以转换为自定义规则排序。可以想像到如果x拼接y得到的数小于y拼接x得到的数,则x小于y,如果x拼接y得到的数大于y拼接x得到的数,则x大于y。
2.通过自定义排序得到的序列转化为字符串即位结果。
具体细节:
1.初始化: 字符串列表 strs ,保存各数字的字符串格式;
2.列表排序: 应用自定义排序 ,对 strs 执行排序;
3.返回值: 拼接 strs 中的所有字符串,并返回。
复杂度分析:
1.时间复杂度:排序算法平均时间复杂度O(NlogN)。
2.空间复杂度:strs占用O(N)的空间复杂度。
代码实现:
class Solution {
public:
string minNumber(vector<int>& nums) {
vector<string> strs;
for (int num : nums) {
strs.push_back(to_string(num));
}
sort(strs.begin(), strs.end(), [](string &x, string &y) {return x + y < y + x;});
string result;
for (string str : strs) {
result.append(str);
}
return result;
}
};
二、扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/ 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
数组长度为 5
数组的数取值为 [0, 13] .
解题思路:
1.先将数组排序,统计出大小王的数量n。
2.判断除大小王是否有重复数字。
3.判断除大小王最大数减最小数是否小于五。
具体细节:
1.将数组排序。
2.遍历数组统计大小王的数量n,以及是否重复。
3.判断最大数减最小数是否小于五。
复杂度分析:
1.时间复杂度:数组的长度为常数5,所以排序和遍历都为常数,O(1)。
2.空间复杂度:O(1)。
代码实现:
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = 0;
for (int i = 0; i < 4; i++) {
if (nums[i] == 0) n++;
else if (nums[i] - nums[i + 1] == 0) return false;
}
if (nums[4] - nums[n] < 5) return true;
return false;
}
};