PAT 1035 Password (20分) 字符替换

本文介绍了一种解决密码中易混淆字符(如1与l,0与O)的方法,通过将特定字符替换为不易混淆的符号(如1替换为@,0替换为%等),以提高密码的辨识度。文章提供了详细的实现思路与代码示例,适用于需要增强密码安全性与可读性的场景。

题目

To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem is that there are always some confusing passwords since it is hard to distinguish 1 (one) from l (L in lowercase), or 0 (zero) from O (o in uppercase). One solution is to replace 1 (one) by @, 0 (zero) by %, l by L, and O by o. Now it is your job to write a program to check the accounts generated by the judge, and to help the juge modify the confusing passwords.

Input Specification:
Each input file contains one test case. Each case contains a positive integer N (≤1000), followed by N lines of accounts. Each account consists of a user name and a password, both are strings of no more than 10 characters with no space.

Output Specification:
For each test case, first print the number M of accounts that have been modified, then print in the following M lines the modified accounts info, that is, the user names and the corresponding modified passwords. The accounts must be printed in the same order as they are read in. If no account is modified, print in one line There are N accounts and no account is modified where N is the total number of accounts. However, if N is one, you must print There is 1 account and no account is modified instead.

Sample Input 1:

3
Team000002 Rlsp0dfa
Team000003 perfectpwd
Team000001 R1spOdfa

Sample Output 1:

2
Team000002 RLsp%dfa
Team000001 R@spodfa

Sample Input 2:

1
team110 abcdefg332

Sample Output 2:

There is 1 account and no account is modified

Sample Input 3:

2
team110 abcdefg222
team220 abcdefg333

Sample Output 3:

There are 2 accounts and no account is modified

题目解读

大意就是对于密码中的部分字符不易区分,采用替换的策略,用 '@' 代替 '1',用 '%' 替换 '0',用 'L' 替换 'l',用 'o' 替换 'O'

输入 N 个名字和密码(长度都不超过10),如果密码中出现 1 0 l O 就按照上面的规则替换,最后输出替换了多少个密码,逐行输出每一个替换后的 名字 密码(名字不替换),要求这些输出的顺序与输入的顺序一致;如果没有需要替换的,那么如果只有一个输出,就输出 There is 1 account and no account is modified;否则 输出 There are N accounts and no account is modifiedN 是输入的个数。(无非就是单数用is,复数用are)

思路分析

  • 字符替换好处理,只需要逐个判断当前字符,若是 1 0 l O 中的一个,就替换成对应的 @ % L o,否则这个位置的字符不变即可。
  • 只要进行替换,这个密码就是修改了的密码,我们需要保存 名字 修改后的密码,这里你可能会考虑需要队列吗,为了保证输出的顺序和输入的一致,先来先服务?不需要的,我们每读入一个输入,就进行处理,这样就保证了先读入,先处理,只需要按顺序保存即可,所以我们只需要一个vector<string>就好了。
  • 逐个处理完输入后,如果vectorsize()0,就说明没有一个输入需要被处理,此时就根据总的输入数目,输出 There is xxxThere are xxxx了;否则就先输出 size,然后依次输出vector中的每一个元素就好了。

代码

#include <iostream>
#include <vector>
using namespace std;

int main() {

    int n;
    vector<string> modified;

    cin >> n;
    string name, passwd;
    for (int j = 0; j < n; ++j) {
        cin >> name >> passwd;
        // 这个密码是否需要校正
        bool flag = false;
        for (int i = 0; i < passwd.length(); ++i) {
            switch (passwd[i]) {
                // 遇到这四个字符进行替换
                case '1': passwd[i] = '@'; flag = true; break;
                case '0': passwd[i] = '%'; flag = true; break;
                case 'l': passwd[i] = 'L'; flag = true; break;
                case 'O': passwd[i] = 'o'; flag = true; break;
                // 其他字符不改变
                default: break;
            }
        }
        // 这个密码被修改了
        if (flag) 
            // 加入被修改过的集合(按顺序处理的,所以加入之后也是按顺序的)
            modified.push_back(name + " " + passwd);
    }
    // 校正了几个密码
    int num = modified.size();
    if (num > 0) {
        cout << modified.size() << endl;
        // 输出校正后的姓名 密码
        for (string str: modified) 
            cout << str << endl;
    // 没有需要校正的,但是原输入只有一个
    } else if(n == 1) {
        cout << "There is 1 account and no account is modified";
    // 没有需要校正的,并且原输入有多个(is 和 are 的区别)
    } else {
        cout << "There are " << n << " accounts and no account is modified";
    }
    return 0;
}
### 关于 PAT 1035 测试点解题思路 对于PAT 1035Password”,主要任务是对给定的密码字符串进行处理,替换容易混淆的字符以提高可读性和区度。具体来说: - 将 `1` 替换为 `@` - 将 `0` 替换为 `%` - 将小写字母 `l` 替换为大写 `L` - 将大写字母 `O` 替换为小写 `o` #### 输入输出说明 输入的第一行为一个正整数N (≤ 10),表示待检测账户的数量。随后N行,每一行给出一个用户的账号及其对应的原始密码,两者之间由单个空格隔[^1]。 为了实现上述功能,可以采用如下算法框架: ```python def password_check_and_modify(accounts): modified_passwords = [] replacements = { '1': '@', '0': '%', 'l': 'L', 'O': 'o' } for account in accounts: username, old_pwd = account.split() new_pwd_chars = [ replacements[char] if char in replacements else char for char in list(old_pwd) ] new_pwd = ''.join(new_pwd_chars) if new_pwd != old_pwd: modified_passwords.append((username, new_pwd)) result_count = len(modified_passwords) output_lines = [f"{result_count}"] + \ [f"{uname} {pwd}" for uname, pwd in modified_passwords] return "\n".join(output_lines) # 示例调用方式 accounts_input = ["Johndoe 12345678", "Alice lOl"] print(password_check_and_modify(accounts_input)) ``` 此代码片段定义了一个函数用于接收包含用户名和旧密码的列表作为参数,返回修改后的结果字符串。如果没有任何密码被更改,则仅输出数字0;如果有任何密码发生了变化,则先输出变更数量,再逐行打印出更新后的用户名与新密码组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值