笔试练习
1.
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abcdacd”过滤结果为“abcd”
要求实现函数
void stringFilter(const char *Input, long len, char *Output)
思路:题目中说了,去除重复字母,那么,过滤后的字符串最多含有一套a~z的字母,那只需要将Input的每个字符对和字符集a~z进行比较,一旦相等,从字符集中去掉这个字符,并将其放入Output的尾部。
代码如下
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
#define MAX 1000
class Func
{
public:
void stringFilter(const char *Input, long len, char *Output)
{
string a = "abcdefghijklmnopqrstuvwxyz";
char *tmp = Output;
for(int i=0; i<len; ++i)//遍历字符串Input
{
string::iterator it = a.begin();
for(int j=0; j<a.size(); ++j)//Input[i]和字符集a中的字符进行对比
{
if(Input[i] != a[j])
{
++it;
continue;
}
else
{
*tmp = a[j];//字符集a中含有,则将其加到Output尾部,并将该字符从a中去除
a.erase(it);
++tmp;
break;
}
}
}
*tmp = '\0';
tmp = NULL;
return;
}
};
int main()
{
char *In = new char[MAX];
char *Out = new char[27];
Func res;
cin>>In;
res.stringFilter(In, strlen(In), Out);
cout<<"Out = "<<Out<<endl;
delete[] Out;
delete[] In;
In = Out = NULL;
return 0;
}
测试数据
①
②
③
2.
通过键盘输入-串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
·仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
·压缩字段的格式为"字符重复的次数+字符"。例如:字符串xxwwyyz "压缩后就成为"3x6yz"。
要求实现函数
void stringZip(const char *Input, long len, char *Output)
思路:两层循环,外层对Input进行遍历,内层统计重复字符count,内层循环退出将count和字符写入Output尾部。
实现代码
#include<iostream>
#include<unistd.h>
#include<string.h>
using namespace std;
#define MAX 1000
class Func
{
public:
void stringZip(const char *Input, long len, char *Output)
{
char *tmp = Output;
char *cu = new char[MAX/4];
for(int i=0; Input[i]!='\0'; ++i)//外层遍历
{
unsigned long count = 1;
while(Input[i+1] != '\0' && Input[i]==Input[i+1])//内层统计重复个数
{
++count;
++i;
}
if(count == 1)
{
*tmp = Input[i];
++tmp;
}
else
{
sprintf(cu, "%lu", count);//sprintf是将cu清空后写入,所以不需要每次memset cu
for(int i=0; i<strlen(cu); ++i)//count写入Output尾部
{
*tmp = cu[i];
++tmp;
}
*tmp = Input[i];
++tmp;
}
}
delete []cu;
tmp = cu = nullptr;
return;
}
};
int main()
{
char *In = new char[MAX], *Out = new char[MAX];
Func res;
cin>>In;
res.stringZip(In, strlen(In), Out);
cout<<Out<<endl;
delete []In;
delete []Out;
In = Out = nullptr;
return 0;
}
测试用例
①
②
3.华为笔试测试题目
给定一个字符串,要求去重,所有字符均保留一个,且保留字符相对位置不变。例如输入“abcdeabyjkqqqqq”,输出“abcdeyjkq”
思路:①传统的方法是遍历字符串,将每一个字符与自己后面的字符比较,有重复去重并移动字符串。
思路:②将拿到输入字符串以后,直接将第一个字符放入输出字符串内,然后,遍历输入字符串,将其字符与输出字符串比较去重,这样的好处是当输入字符串重复率越高,时间复杂度越低。
实现代码
#include<iostream>
#include<string.h>
using namespace std;
#define MAX 1000
void stringFilter(const char *Input, long len, char *Output)
{
if(len == 0)
return;
Output[0] = Input[0];
for(int i=1; Input[i]!='\0'; ++i)
{
int j;
for(j=0; Output[j]!='\0'; ++j)
{
if(Input[i] != Output[j])//输入与输出对比
continue;
else
break;
}
if(Output[j] == '\0')//在输出中没有找到输入字符
{
Output[j] = Input[i];
Output[j+1] = '\0';
}
}
return;
}
int main()
{
char *In = new char[MAX], *Out = new char[MAX];
cin>>In;
stringFilter(In, strlen(In), Out);
cout<<Out<<endl;
delete[] In;
delete[] Out;
In = Out = NULL;
return 0;
}
测试用例
4.字符排序
给定一个字符串,里面包含数字字符,要求将其中的数字提取出来并排序。
输入“abc9hsf']7qd09fsf2dsd1”
输出“012799”
思路:我们的目标是10个数字,那么我们只需要统计该字符串含有多少个0,1,2...,9,然后将其按顺序放入输出字符串即可
代码
#include<iostream>
#include<string.h>
using namespace std;
#define MAX 1000
void Func(const char *Input, long len, char *Output)
{
if(len == 0)
return;
char *tmp = Output;
int a[10]={0};
for(int i=0; Input[i]!='\0'; ++i)//统计目标字符个数
{
switch(Input[i])
{
case '0':
++a[0];
break;
case '1':
++a[1];
break;
case '2':
++a[2];
break;
case '3':
++a[3];
break;
case '4':
++a[4];
break;
case '5':
++a[5];
break;
case '6':
++a[6];
break;
case '7':
++a[7];
break;
case '8':
++a[8];
break;
case '9':
++a[9];
break;
default:
break;
}
}
for(int i=0; i<10; ++i)//按顺序将字符放入输出字符串
{
while(a[i] > 0)
{
*tmp = '0' + i;
++tmp;
--a[i];
}
}
*tmp = '\0';
return;
}
int main()
{
char *In = new char[MAX], *Out = new char[MAX];
cin>>In;
Func(In, strlen(In), Out);
cout<<Out<<endl;
delete[] In;
delete[] Out;
In = Out = nullptr;
return 0;
}
测试用例