C++字符串处理题[第一周-T3] 天使数

[第一周-T3] 天使数

题目描述

定义一个数是“天使数”,当且仅当下面三个性质被满足:

Rain:不存在相邻的两个相同数位;
Angle:数至少为两位数,且第一位和最后一位均为 9 9 9
Kawaii:每个数码均出现过偶数次。

给定 n n n 个数,删除其中的所有天使数并报告剩余的数的数量。

例: 912129 912129 912129 是天使数,而 9119 9119 9119 则不是,因为它不满足第一个性质。

输入格式

第一行一个正整数 n n n,下一行 n n n 个正整数。

输出格式

一行一个整数,表示剩余的数的数量。

样例 #1

样例输入 #1

5
99 912129 192921 123 9239

样例输出 #1

4

提示

【数据范围】

分值 n n n 特殊性质
10 ≤ 1 \le 1 1
10 ≤ 1 0 5 \le 10^5 105 A
40 ≤ 1 0 5 \le 10^5 105 B
40 ≤ 1 0 5 \le 10^5 105

特殊性质 A:所有数位数均为奇数;
特殊性质 B:所有数均为六位数。

对于所有数据满足: 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1n105,每个数的大小在 1 1 1 1 0 9 10^9 109 之间。

思路

总之题目只需要判断三种情况,命名为“天使数“ 所以只需要一个布尔函数判断是否满足这些条件。代码用了反逻辑,如果满足了,布尔函数返回false,相同,在驻韩束里如果不满足布尔函数,那就证明满足了至少一个天使数字的条件。
isAngelNumber

  • 先把数字转换成字符串,方便判断
  • 第一个性质,判断相邻数
  • 第二个性质,至少为两位数+第一个数/最后一个数为9
  • 第三个性质,每个数出现过偶数次
#include 
#include 

using namespace std;


bool isAngelNumber(int num) {
    string str_num = to_string(num);//强制把数字转换成字符串
    int n = str_num.length();
    
    // 检查第一个性质
    for (int i = 1; i <= n; i++) {
        if (str_num[i] == str_num[i - 1]) {
            return false;
        }
    }
    
    // 检查第二个性质
    if (n < 2 || str_num[0] != '9' || str_num[n - 1] != '9') {
        return false;
    }
     
    // 检查第三个性质
    int digit_count[10] = {0};
    for (int i = 0; i < str_num.length(); ++i) {
        char digit = str_num[i];
        digit_count[digit - '0']++;
    }

    for (int i = 0; i < 10; ++i) {
        if (digit_count[i] % 2 != 0) {
            return false;
        }
    }
    //不满足
    return true;
}

int main() {
    int n,count=0;
    cin >> n;
    
    vector<int> numbers(n);
    
    for (int i = 0; i < n; ++i) {
        cin >> numbers[i];
    }
    for (int i=0;i<n;i++) {
        if (!isAngelNumber(numbers[i])) {//满足
            count++;
        }
    }
    
    cout << count;
    
    return 0;
}

你可能感兴趣的:(算法,c++,笔记,学习)