笔试练习

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;
}

 

 测试用例

 

 

 

 

 

 

posted @ 2020-04-21 22:05  C_hp  阅读(147)  评论(0编辑  收藏  举报