这类题目几乎不需要数据结构,算法基础,主要通过简单的逻辑流程和判断实现。
题目描述如下:
大致题意:
首先输入一个整数N(<=1000),紧接着输入N行数据,每行数据包括用户名和密码,之间用空格进行分割,如果密码包含”0“,”1“,”l“,”O“,则把零转换成%,把一转换成@,把小写l转换成大写L,把大写O转换成小写o。
输出有多少个用户名的密码进行了转换,并且按顺序输出转换后的用户名和密码。
如果都没进行转换,则输出”There is N account and no account is modified“,N是测试数据的行数。
基本思路:
使用STL的vector<vector<string> >
来存储输入的测试数据,每一行测试数据存储到内层的vector中,然后将内层的vector存储到外层的vector。
然后使用for循环对vector进行遍历,在遍历的过程中进行操作,将改变了的字符串存储在另一个双层vector中,最后使用for循环进行输出。
提交结果如下:
有一个测试用例未通过测试,最后得分17分,冥思苦想,未想到遗漏了哪种情况。
代码如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
bool is_contain(string str); //判断字符串中是否含有以上4种字符
string func(string str); //将含有以上4种字符串的字符进行转换
int main()
{
int n;
cin>>n;
vector<vector<string> > arr;
vector<vector<string> > ans;
for(int i=0;i<n;i++)
{
vector<string> temp;
string name,password;
cin>>name>>password;
temp.push_back(name);
temp.push_back(password);
arr.push_back(temp);
temp.clear();
}
for(int i=0;i<arr.size();i++)
{
if(is_contain(arr[i][1]))
{
vector<string> temp;
temp.push_back(arr[i][0]);
temp.push_back(func(arr[i][1]));
ans.push_back(temp);
temp.clear();
}
}
if(ans.size()==0)
{
cout<<"There is "<<n<< " account and no account is modified"<<endl;
return 0;
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
{
cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
}
}
bool is_contain(string str)
{
for(int i=0;i<str.size();i++)
{
if(str[i]=='0'||str[i]=='1'||str[i]=='l'||str[i]=='O')
return true;
}
return false;
}
string func(string str)
{
for(int i=0;i<str.size();i++)
{
if(str[i]=='0')
str[i]='%';
if(str[i]=='1')
str[i]='@';
if(str[i]=='l')
str[i]='L';
if(str[i]=='O')
str[i]='o';
}
return str;
}
提交后,排名暂时在30881