1. 删除公共字符
题目描述
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
题目分析
- 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。
- 判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串.
C++代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1, str2;
getline(cin,str1);//不能用cin输入,遇到空格会停止
getline(cin,str2);
int hash[256] = {0};//建立一个哈希表
int len2 = str2.size();
for(size_t i = 0; i < len2; i++)
{//记录str2里面的字符
hash[str2[i]]++;
}
string ret;
int len1 = str1.size();
for(size_t i = 0; i < len1; i++)
{
if(hash[str1[i]] == 0)
{
ret = ret + str1[i];
}
}
cout << ret << endl;
return 0;
}
2. 合法括号序列判断
题目描述
对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串。
给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串。
题目分析
用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。
C++代码
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
stack<char> st;
for(auto e : A)
{
if(e == '(')
{
st.push(e);
}
else if(e == ')')
{
if(st.empty() || st.top() != '(')
{
return false;
}else{
st.pop();
}
}else{
return false;
}
}
return true;
}
};
3. 两种排序方法
题目描述
考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
“car” < “carriage” < “cats” < "doggies < “koala”
2.根据字符串的长度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。
题目分析
思路很简单,将接受的字符串都放到vector容器中,利用string的operator>=运算符重载来按ascii比较字符串,利用string的size来比较字符串的长度.
C++代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<string> v;
v.resize(n);
for(auto& str : v)
cin>>str;
bool flag1= true, flag2 = true;
for(size_t i = 1; i < v.size(); i++)
{
if(v[i-1] >= v[i])
{
flag1 = false;
break;
}
}
for(size_t i = 1; i < v.size(); i++)
{
if(v[i-1].size() >= v[i].size())
{
flag2 = false;
break;
}
}
if(flag1 && flag2)
{
cout<< "both" << endl;
}
else if(flag1 && !flag2)
{
cout << "lexicographically" << endl;
}
else if(!flag1 && flag2)
{
cout << "lengths" << endl;
}
else if(!flag1 && !flag2)
{
cout << "none" << endl;
}
return 0;
}
4. 密码强度等级
题目描述
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
题目分析
这里对于不同种类的字符得分不同,同学们可以现对每一个维度进行单独判断,即对于长度,字母,数字,符号单独判断,最后把所有的单项值根据题目要求相加,输出对应的安全级别.
C++代码
#include <iostream>
#include <string>
using namespace std;
int numChar(string str)
{
int big = 0, small = 0;
for(int i = 0; i < str.size(); i++)
{
if(str[i] >= 65 && str[i] <= 90)
{
big++;
}
else if(str[i] >= 97 && str[i] <= 122)
{
small++;
}
}
if((big + small)==0)
{
return 0;
}
else if(((big == 0) && !(small == 0)) || (!(big == 0) && (small == 0)))
{
return 10;
}
else if(big > 0 && small > 0)
{
return 20;
}
return 0;
}
int numNumer(string str)
{
int count = 0;
for(int i = 0; i < str.size(); i++)
{
if(str[i] - '0' >= 0 && str[i] - '0' <=9)
{
count++;
}
}
if(count == 0)
{
return 0;
}
else if(count == 1)
{
return 10;
}
else
return 20;
}
int numSymbal(string str)
{
int num = 0;
for(int i = 0; i < str.size(); i++)
{
if(!(str[i] >= 65 && str[i] <= 90)
&& !(str[i] >= 97 && str[i] <= 122)
&& !(str[i] - '0' >= 0 && str[i] - '0' <= 9))
{
num++;
}
}
if(num == 0)
{
return 0;
}
else if(num == 1)
{
return 10;
}
else
{
return 25;
}
}
int main()
{
string str;
while(cin >> str)
{
int sum = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0 ,extra = 0;
int len = str.size();
if (len <= 4)
sum1 = 5;
else if (len >= 8)
sum1 = 25;
else
sum1 = 10;
sum2 = numChar(str);
sum3 = numNumer(str);
sum4 = numSymbal(str);
if((sum2 > 0) && (sum3 > 0) && (sum4 > 0))
{
if(sum2 == 10)
{
extra = 3;
}
else
{
extra = 5;
}
}
else if((sum2 > 0) && (sum3 > 0) && (sum4 == 0))
{
extra = 2;
}
sum = sum1 + sum2 +sum3 +sum4 + extra;
if(sum >= 90)
{
cout << "VERY_SECURE" << endl;
}
else if(sum >= 80)
{
cout << "SECURE" <<endl;
}
else if(sum >= 70)
{
cout << "VERY_STRONG" << endl;
}
else if(sum >= 60)
{
cout << "STRONG" <<endl;
}
else if(sum >= 50)
{
cout << "AVERAGE" <<endl;
}
else if(sum >= 25)
{
cout << "WEAK" <<endl;
}
else
cout << "VERY_WEAK"<<endl;
}
return 0;
}