力扣 299. 猜数字游戏

第一次代码

在这里插入图片描述

#include <iostream>
using namespace std;
#include <string>
#include <unordered_map>
#include <algorithm>

int main()
{
    string secret = "1122";
    string guess =  "0001";
    int n = secret.size();
    int count1 = 0;
    vector<pair<int, char>> arr;
    vector<pair<int, char>> arr2;
    for (int i = 0; i < n; ++i) {
        if (secret[i] == guess[i]) {
            arr.emplace_back(make_pair(i, 'x'));
            arr2.emplace_back(make_pair(i,'x'));
            count1++;
        }
        else {
            arr.emplace_back(make_pair(i, secret[i]));
            arr2.emplace_back(make_pair(i, guess[i]));
        }
    }

    for (int i = 0; i < n; ++i) {
        cout << "元素:" << arr[i].first << " " << arr[i].second << " ";
        cout << endl;
    }
    for (int i = 0; i < n; ++i) {
        cout << "元素:" << arr[i].first << " " << arr2[i].second << " ";
        cout << endl;
    }

    int count2 = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (arr2[i].second != 'x' && arr[j].second == arr2[i].second) {
                count2++;
                arr[j].second = 'x';
                break;
                //arr.emplace_back(make_pair(0, 'x'));
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        cout << "元素:" << arr[i].first << " " << arr[i].second << " ";
        cout << endl;
    }

    cout << count1 << endl;
    cout << count2 << endl;

    system("pause");
    return 0;
}

在这里插入图片描述

第二次代码

在这里插入图片描述

#include <iostream>
using namespace std;
#include <string>
#include <unordered_map>
#include <algorithm>

int main()
{
    string secret = "1807";
    string guess =  "7810";
    int n = secret.size();
    int count1 = 0;

    for (int i = 0; i < n; ++i) {
        if (secret[i] == guess[i]) {
            secret[i] = 'x';
            guess[i] = 'x';
            count1++;
        }
    }
    cout <<"secret元素为:" << secret << endl;
    cout <<"guess元素为:"  << guess << endl;

    int count2 = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (guess[i] != 'x' && secret[j] == guess[i]) {
                count2++;
                secret[j] = 'x';
                break;
                //arr.emplace_back(make_pair(0, 'x'));
            }
        }
    }

    cout << count1 << endl;
    cout << count2 << endl;

    system("pause");
    return 0;
}

第三次代码

根据题意,对于公牛,需要满足数字和确切位置都猜对。我们可以遍历 \textit{secret}secret 和 \textit{guess}guess,统计满足 \textit{secret}[i]=\textit{guess}[i]secret[i]=guess[i] 的下标个数,即为公牛的个数。
对于奶牛,需要满足数字猜对但是位置不对。我们可以在 \textit{secret}[i]\ne\textit{guess}[i]secret[i]
=guess[i] 时,分别统计 \textit{secret}secret 和 \textit{guess}guess 的各个字符的出现次数,记在两个长度为 1010 的数组中。根据题目所述的「这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字」,由于多余的数字无法匹配,对于 \texttt{0}0 到 \texttt{9}9 的每位数字,应取其在 \textit{secret}secret 和 \textit{guess}guess 中的出现次数的最小值。将每位数字出现次数的最小值累加,即为奶牛的个数。

class Solution {
public:
    string getHint(string secret, string guess) {
        int bulls = 0;
        vector<int> cntS(10), cntG(10);
        for (int i = 0; i < secret.length(); ++i) {
            if (secret[i] == guess[i]) {
                ++bulls;
            } else {
                ++cntS[secret[i] - '0'];
                ++cntG[guess[i] - '0'];
            }
        }
        int cows = 0;
        for (int i = 0; i < 10; ++i) {
            cows += min(cntS[i], cntG[i]);
        }
        return to_string(bulls) + "A" + to_string(cows) + "B";
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值