此实例为华为2019实习生二次笔试题1,首先看双双字符串的定义:
双对称字符串:
1、正序逆序相同。
2、偶数个字符.
3、从第一个字符开始每一对字符相同(aabbccbbaa)。
输入和 输出要求如下:
题目:判断输入的字符串是否为双对称字符串,是的话输出对应的单对称字符串(aabbaa则输出aba),否则输出false。
网上的一些方法大都是采用数组的思想,以单个字符逐一比较来进行判断,这样做显得有些舍近求远,如果使用C/C++中string类封装好的方法来解,代码量会少很多。
在编程时需要注意一点,输入结束的标志是两个连续的换行符,这里如果换成数组来判断不如vector来得直接。
直接看程序运行结果:
编程思想直接看代码吧,注释很详细了。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string> instr; //输入的单行或多行字符串
vector<string> outstr; //去重后输出的字符串
vector<string> judgestr; //判断该行是否是双双字符串的结果,是输出true,否输出flase
void fun()
{
string linestr; //接收每一行输入的字符串
/* 获取输入,以空行结束输入 */
while (getline(cin, linestr))
{
if (!linestr.empty()) //如果输入的一行为空(即换行),结束输入
{
instr.push_back(linestr); //将每一行字符串作为一个单元保存
}
else
{
//cout << "输入结束!" << endl;
break;
}
}
/* 主函数部分,判断双双字符串 */
vector<string> rev_str; //复制原字符集
rev_str = instr;
string out_ = ""; //去双后的单行字符串
//字符串取逆
for (int i = 0; i < instr.size(); i++)
{
reverse(instr[i].begin(), instr[i].end());
if ((rev_str[i].compare(instr[i]) == 0) && (instr[i].size() % 2 == 0))
{
out_ = "";
judgestr.push_back("true");
for (int j = 0; j < rev_str[i].size(); j += 2)
{
out_ += rev_str[i][j];
}
outstr.push_back(out_);
}
else
{
judgestr.push_back("flase");
outstr.push_back("flase");
}
}
/* 输出结果 */
cout << "\n/* 输出结果 */" << endl;
for (int m = 0; m < outstr.size(); m++)
{
cout << outstr[m] << endl;
}
cout << "\n/* 判断结果 */" << endl;
for (int m = 0; m < judgestr.size(); m++)
{
cout << judgestr[m] << endl;
}
}
void main()
{
printf("请输入要判断的字符集,以空行结束输入:\n");
fun();
getchar();
}
每天学习一点,加油鸭!