Day16 2022.11.22 排序(简单)
45.把数组排成最小的数
自己实现
没有思路
题解
也是比较大小,只是这个比较大小的方法是两个数字字符串string x
和string y
,如果x
+y
<y
+x
,说明x
应该在前面,这里暂且定义为x
<y
。然后正常比较大小,采用适当的排序方法即可
代码如下:
class Solution {
public:
string minNumber(vector<int>& nums) {
int min = 99999;
int i, j;
int pos;
for (i = 0; i < nums.size() - 1; i++)
{
min = nums[i];
pos = i;
for (j = i + 1; j < nums.size(); j++)
{
if (to_string(min) + to_string(nums[j]) > to_string(nums[j]) + to_string(min))
{
min = nums[j];
pos = j;
}
}
int tmp = nums[i];
nums[i] = nums[pos];
nums[pos] = tmp;
}
string res = "";
for (i = 0; i < nums.size(); i++)res += to_string(nums[i]);
return res;
}
};
代码表现
因为采用的是最简单的选择排序,所以时间很久
hint:
- int和string的互相转化
- int转成string:
string str=to_string(i);
- string转成int:
int a=atoi(str.c_str())
- int转成string:
61.扑克牌中的顺子
自己实现
一开始想的是直接排序,因为大小王是0所以会被直接放到数组最开始,然后再判断后面的相邻两个元素之间的差值是否能满足。但是感觉这个方法很难实现并且很慢,所以直接看题解了。
题解
满足两个条件即符合顺子:
- 除了大小王(0)之外没有重复的牌
- ***最大值-最小值<5
代码如下:
class Solution {
public:
bool isStraight(vector<int>& nums) {
set<int> repeat;
if(nums.size()!=5)return false;
int i;
int max=-1;
int min=20;
for(i=0;i<nums.size();i++)
{
if(nums[i]!=0 && repeat.count(nums[i])==1)return false;
repeat.insert(nums[i]);
if(nums[i]!=0)
{
if(nums[i]>max)max=nums[i];
if(nums[i]<min)min=nums[i];
}
}
if(max-min<5)return true;
return false;
}
};
代码表现
hint:
- 处理几个值是否连续且这几个值不重复的判断时,可以采用
最大值-最小值
来进行判断,即将值框定在某个范围内即可,这样的判断很牛 - set容器的一些操作