目录
面试题45. 把数组排成最小的数
面试题61. 扑克牌中的顺子
面试题45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"示例 2:
输入: [3,30,34,5,9]
输出: "3033459"来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。【解法一】
主要考察比较方式的传递,按照俩个字符串根据俩种方式拼接好之后,判断俩种方式哪个字符串小就在前。
bool compare(int left, int right) { string s1 = to_string(left); string s2 = to_string(right); return (s1+s2) < (s2+s1); } class Solution { public: string minNumber(vector<int>& nums) { sort(nums.begin(), nums.end(), compare); string res; for (auto e : nums) { res += to_string(e); } return res; } };
面试题61. 扑克牌中的顺子
从若干副扑克牌中随机抽 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来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。【解法一】
class Solution { public: bool isStraight(vector<int>& nums) { sort(nums.begin(),nums.end()); int zero = 0; for(int i = 0; i < 4; ) { if(nums[i] == 0) zero++; else { if(nums[i] == nums[i+1]) // 有重复直接返回false return false; if(nums[i+1] != nums[i]+1) // 如果后一个与前一个不构成顺序 { if(zero) // 有大小王就可以进行替换 { nums[i] = nums[i]+1; zero--; continue; } else // 没有就报错 return false; } } i++; } return true; } };
【解法二】设置了一个中间差的牌个数,比如0 0 1 2 5 (2和5之间差了俩张牌)如果差个牌数可以用大小王替代那就返回真。
class Solution { public: bool isStraight(vector<int>& nums) { sort(nums.begin(),nums.end()); int zero = 0; int _zero = 0; for(int i = 0; i < 4; i++) { if(nums[i] == 0) zero++; else if(nums[i] == nums[i+1]) return false; else if(nums[i]+1 != nums[i+1]) _zero += nums[i+1]-nums[i]-1; } return _zero<=zero; } };
【解法三】set 卡出一个上下限
class Solution {
public:
bool isStraight(vector<int>& nums) {
set<int> repeat;
int _min = 14, _max = 0;
for(auto e : nums)
{
if(e==0)continue;
if(repeat.find(e) != repeat.end())return false;
_min = min(e, _min);
_max = max(e, _max);
repeat.insert(e);
}
return _max-_min < 5;
}
};