2019网易实习笔试题——给字符串定义符号运算(上)

2019年网易游戏实习笔试题,题目大概的意思是给字符串定义六种符号运算规则:
加法:B 字符串拼接到 A字符串后面
减法:在A 字符串中删除第一个出现的和B字符串相同的子串
乘法:在A中的任意两个字符之间插入B字符串
除法:在A中删除和B字符串相同的子串
取反:将A字符串逆置
变换:将A中的大写字母变成小写字母
后面的进行运算的话,基本是和原来的四则运算是差不多的,采用队列和栈、后缀表达式进行计算,

加法

void string_add(string &a, string &b)          //将B字符串加入中A 字符中
{
    a = a + b;

}

减法

void string_minus(string &a, string &b)        //在A中删除第一次和 B 字符串相同的字符串
{
    int count = 0;
    int s = 0;
    int i = 0;
    while (count != b.size() && i != a.size())         //当连续相同元素的个数等于V.size()时  或者   当没有任何元素相同的时候,退出循环比较
    {
        count = 0;
        if (a[i] == b[0])
        {
            s = i;                                               //保存第一个相同的元素的位置小标
            for (int j = 0; j < b.size(); ++j)
            {
                if (a[i++] == b[j])
                    count++;                                      //统计相同元素的个数

            }
        }
        else
            ++i;
    }
    if (s != 0 && count == b.size())                //  找到了第一个相同元素的位置,并且后面重合的长度等于v.size() ,则进行相应的删除 重复元素操作
        a.erase(a.begin() + s, a.begin() + s + b.size());
}

乘法

void string_multiplication(string &a, string &b)     //在A中的任意两个字符中插入 B 字符串
{
    int a_count = a.size();  //记录A字符串原先的长度
    for (int i = 0; i < a_count - 1; ++i)     //因为只要在前 n-1个字符后面插入 B字符串
        a.insert(a.begin() + 1 + i*(b.size() + 1), b.begin(), b.end());
}

除法

void string_division(string &a, string &b)          //删除字符串中的重复 B中的元素
{
    int count = 0;
    int s = 0;
    int i = 0;
    while (1)                                      //不断删除 a中 含有的 v 字符串
    {
        count = 0;                          //保存每一个比较中具有相同元素的个数
        s = 0;                       // 
        i = 0;
        int b_s = 1;                            //标志位,记录是否有元素删除       
        while (count != b.size() && i != a.size())         //当连续相同元素的个数等于V.size()时  或者   当没有任何元素相同的时候,退出循环比较
        {
            count = 0;
            if (a[i] == b[0])
            {
                s = i;                                               //保存第一个相同的元素的位置小标
                for (int j = 0; j < b.size(); ++j)
                {
                    if (a[s++] == b[j])
                        count++;                                      //统计相同元素的个数

                }
            }
            ++i;                                                //无论是否有相同的元素,每次比较完都需要往后移动一个
        }
        if (s != 0 && count == b.size())      //  找到了第一个相同元素的位置,并且后面重合的长度等于v.size() ,则进行相应的删除 重复元素操作
        {
            a.erase(a.begin() + i - 1, a.begin() + i - 1 + b.size());
            b_s = 0;
        }
        if (b_s == 1)                    //当没有删除字符串操作的时候就退出循环
            break;
    }
}

取反


void string_reverse(string &a)            //字符串的逆置
{
    reverse(a.begin(), a.end());
}

变换

void string_tochange(string &a)             //字符串变成小写
{
    for (int i = 0; i < a.size(); ++i)
    if (a[i] >= 'A' && a[i] <= 'Z')
        a[i] = char(a[i] + 32);          // 大写字母的ASCII 加上32,并且进行类型变换
}

猜你喜欢

转载自blog.csdn.net/u014077947/article/details/79766463
今日推荐