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,并且进行类型变换
}