【字符串2】(删除公共字符、合法括号序列判断、两种排序方法、密码强度等级)

1. 删除公共字符

题目描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29868&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目分析

  1. 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。
  2. 判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串.

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值代表它是否为一个合法的括号串。

https://www.nowcoder.com/practice/d8acfa0619814b2d98f12c071aef20d4?tpId=8&&tqId=11039&rp=1&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

题目分析

用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。

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”
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

https://www.nowcoder.com/practice/839f681bf36c486fbcc5fcb977ffe432?tpId=85&&tqId=29844&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

题目分析

思路很简单,将接受的字符串都放到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. 密码强度等级

题目描述

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

https://www.nowcoder.com/practice/52d382c2a7164767bca2064c1c9d5361?tpId=37&&tqId=21310&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

题目分析

这里对于不同种类的字符得分不同,同学们可以现对每一个维度进行单独判断,即对于长度,字母,数字,符号单独判断,最后把所有的单项值根据题目要求相加,输出对应的安全级别.

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值