C++笔试强训day9

发布于:2024-04-29 ⋅ 阅读:(31) ⋅ 点赞:(0)

目录

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;
    }
};

这种数学解法值得学习,虽然我个人觉得有点难想到。