目录
1.添加逗号
2.跳台阶
3.扑克牌顺子
day9的题目都比较简单,就不赘述了
1.添加逗号
链接
我的思路很清晰也很简单易懂:
把输入数据存入字符串string s,定义一个string ret,然后逆置string s,将s中的数一个一个存入ret,每三个数加一个逗号,最后逆置ret后输出就行。
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
signed main()
{
string si;
cin >> si;
string tmp;
reverse(si.begin(), si.end());
for (int i = 0; i < si.size(); ++i)
{
if (i + 1 < si.size() && (i + 1) % 3 == 0)
{
tmp += si[i];
tmp += ',';
}
else
{
tmp += si[i];
}
}
reverse(tmp.begin(), tmp.end());
cout << tmp << endl;
}
2.跳台阶
链接
基本dp问题:
#include <iostream>
using namespace std;
const int N = 60;
int dp[N];
int main()
{
int n;
cin >> n;
// 初始化
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; ++i)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
cout << dp[n] << endl;
return 0;
}
3.扑克牌顺子
链接
我当时的思路是排完序之后分情况讨论,即分别有几个零的情况:
class Solution {
public:
// 哈希加分类
int cnt0 = 0;
bool IsContinuous(vector<int>& numbers) {
for (auto i : numbers) {
if (i == 0)
cnt0++;
}
sort(numbers.begin(), numbers.end());
if (cnt0 == 4)
return true;
if (cnt0 == 3)
if (numbers[4] - numbers[3] < 5 && numbers[4] !=numbers[3])
return true;
if (cnt0 == 2) {
for (int i = 2; i < 4; ++i) {
if (numbers[i + 1] - numbers[i] > 1) {
cnt0 = cnt0 - (numbers[i + 1] - numbers[i]) + 1;
}
}
if (cnt0 >= 0)
return true;
}
if (cnt0 == 1) {
for (int i = 1; i < 4; ++i) {
if (numbers[i + 1] - numbers[i] > 1) {
cnt0 = cnt0 - (numbers[i + 1] - numbers[i]) + 1;
}
}
if (cnt0 >= 0)
return true;
}
if (cnt0 == 0) {
for (int i = 0; i < 4; ++i) {
if (numbers[i + 1] - numbers[i] != 1)
return false;
}
return true;
}
return false;
}
};
还有一种优质解法就是先找出规律:
随后直接秒了:
class Solution
{
bool hash[14] = { 0 };
public:
bool IsContinuous(vector<int>& numbers)
{
int maxVal = 0, minVal = 14;
for (auto x : numbers)
{
if (x)
{
if (hash[x]) return false;
hash[x] = true;
maxVal = max(maxVal, x);
minVal = min(minVal, x);
}
}
return maxVal - minVal <= 4;
}
};
这种数学解法值得学习,虽然我个人觉得有点难想到。