创建最短回文字符串
最近做的线上面试题,第二题不会就没有提交。
这段代码不支持汉字输入。
一、输入输出
输入:acca
输出:acca
输入:nice!
输出:nice!ecin
输入:koaa
输出:koaaok
二、函数
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
void huiwen(string &s1)
{
int len, flag = 1, z = 1;
len = strlen(s1.c_str());//字符串长度
if(len == 1)
{
cout<<s1<<endl;
return;
}
int hlen = len/2;
char p1[hlen+1];
char p2[hlen+1];
char s2[len+1];
char *s;
s = new char[len+1];
for(int k=0;k<len;k++)
{
s2[k] = s1[len-1-k];
}
s2[len] = '\0';
//cout<<s2<<endl;
if(len%2 == 0)
{
for(int i=0;i<hlen;i++)
{
p1[i] = s1[i];
}
p1[hlen] = '\0';//解决长度小于3时出现的问题
for(int j=0;j<hlen;j++)
{
p2[j] = s1[j+hlen];
}
p2[hlen] = '\0';
}
else
{
for(int i=0;i<hlen;i++)
{
p1[i] = s1[i];
}
p1[hlen] = '\0';
for(int j=0;j<hlen;j++)
{
p2[j] = s1[j+hlen+1];
}
p2[hlen] = '\0';
}
for(int k=0;k<hlen;k++)
{
flag = (p1[k] == p2[hlen-1-k]);
if (flag == 0)
break;
}
switch(flag)
{
case 0: {
for(int i=len-2;i>=0;i--)
{
flag = (s1[len-1] == s1[i]);
if(flag)
z++;
else
break;
}
//cout<<"z = "<<z<<endl;
int h=0;
while(s1[h] != '\0')
{
s[h] = s1[h];
h++;
}
h = 0;
while(s2[h+z] != '\0')
{
s[len+h] = s2[h+z];
h++;
}
s[len+h] = '\0';
cout<<" "<<s<<endl;
break;
}
case 1: cout<<" "<<s1<<endl;break;
}
delete []s;
}
三、测试程序
总结:
自我反省:
1.精力不集中,写得太拖拉;
2.一开始没写伪代码,后面一直在重复同样工作;
3.对字符串理解不够透彻,写得时候总报错(应该说是字符型数组);
4.对汉字的处理不到位。
如果大家发现漏洞或者错误敬请提出,我会非常感谢,希望能和大家一起学习进步。
2020.8.20