一:题目
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
输入格式:
输入首先给出一个正整数N(≤10
5
),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。
输出格式:
针对每条指令,给出相应的信息:
1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。
输入样例:
5
L 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq
L 1234567890 myQQ@qq.com
输出样例:
ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
二:思路分析
本题又用到了map容器,既然用到了容器,我们就会考虑该如何 往容器里赋值吧,然后再考虑容器当中的值该如何利用才能符合题意。我用的数组往其中赋值,赋值的对象为 容器当中 未出现过的号码(指的是新用户),然后在’L’操作中 看输入的号码是否在容器中出现过 ,出现过说明这是一个已经申请好的号码,如果没有则输出”ERROR: Not Exist“;如果出现过,然后在比较密码的正确性。
三:上码
#include<bits/stdc++.h>
using namespace std;int main(){int N;cin >> N;map<string,string>m;map<string,string>::iterator t;for( int i = 0; i < N; i++ ){char p1;string str1,str2;cin >> p1 >> str1 >> str2; t = m.find(str1);//t就相当于C里面的指针 if(p1 == 'N'){if( t == m.end()){m[str1] = str2;//将新号码装进容器当中 cout << "New: OK" << endl; }else{cout << "ERROR: Exist" << endl; } }if(p1 == 'L'){if(t == m.end()){cout << "ERROR: Not Exist" << endl;}else{if(m[str1] == str2)//这是 又输入的密码 和 map容器当中存进去的进行比较 cout << "Login: OK" << endl;elsecout << "ERROR: Wrong PW" << endl; }}}
}
另一种做法:
但pta的最后一个点过不去
我自己用的测试例子:
专门测试最后一个测试点,输出都正确 ``
4
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq.com
N 1234567891 myQQ@qq.cop
L 1234567891 myQQ@qq.cop
4
N 1234567890 myQQ@qq.com
N 1234567891 myQQ@qq.cop
L 1234567891 myQQ@qq.cop
L 1234567890 myQQ@qq.com
//如果第一个用户为老用户 则必定不存在 直到遇见新用户后 再调用 L 时考虑 其密码的规范性 来判断其是否存在#include<bits/stdc++.h>
using namespace std;void New_Old(vector<char>&v1,vector<int>&v2,vector<string>&v3){int flag = 0,m = -1,n;vector<int>p1;//创建一个容器 存正确的号码vector<string>p2; for( int i = 0; i < v1.size(); i++ ){if(v1[i] == 'N' && flag == 0) //记录下正确的号码和密码 {m = i;flag = 1; p1.push_back(v2[m]); //将正确申请好的 号码 和 密码 存进容器当中 p2.push_back(v3[m]);// cout << "New: OK" << endl; }else if( v1[i] == 'N' ) //后面又遇到了 N {if(v2[i] == v2[m])cout << "ERROR: Exist" << endl; } //出现新的号码时 if( v2[i+1] != v2[m] ) {flag = 0;} if(v1[i] == 'L'){if(!p1.empty() ){//挑选出 已经申请好的 号码 for( int k1 = 0; k1 < p1.size(); k1++){if(v2[i] == p1[k1]){n = k1;break;}}if( v2[i] == p1[n])//老的号码和以前申请的号码相同 接下来比较 密码输入的正确性 和 规范性 {string str = v3[i];string str1 = p2[n];//标准的密码 int temp1 = 0;//判断是否有 空格for( int j = 0; j < str.size(); j++ ){if(str[j] == ' ')temp1 = 1;} if(str.size() < 6 && str.size() > 16){cout << "ERROR: Wrong PW" << endl; }else if( temp1 == 1 ){cout << "ERROR: Wrong PW" << endl;}else if( str1 != str ){cout << "ERROR: Wrong PW" << endl;}else{cout << "Login: OK" << endl;}} }else //老号码还没有申请 {cout << "ERROR: Not Exist" << endl; } }}
}int main(){int N;vector<char>v1;vector<int>v2;vector<string>v3;cin >> N;for(int i = 0; i < N; i++ ){char temp1;int temp2;string temp3;cin >> temp1 >> temp2 >> temp3;v1.push_back(temp1);v2.push_back(temp2);v3.push_back(temp3);}New_Old(v1,v2,v3);}4
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq.com
N 1234567891 myQQ@qq.cop
L 1234567891 myQQ@qq.cop