CVTE笔试试题-第一个字符串中删除第二 个字符串中没有出现过的字符,并返回第一个字符串的指针

题目:

实现以下函数:输入为两个字符串指针,要求从第一个字符串中删除第二 个字符串中没有出现过的字符,并
  返回第一个字符串的指针。实现函数:
  char* intersectStr(char* str1, char* str2)示例:
  输入: str1="Welcome CVTE" str2="KEem"输出: "emeE"

主要问题:
             1、如何判断那些字符是需要删除的字符。同很多字符串问题一样,可以开辟一个哈希数组,全部初始化为false,将第二个字符串中字符对应的映射位置置为ture,表示这些位置对应的字符在第一个字符串中需要删除。

              2, 如何删除实现删除字符操作,我们采用删除元素后面元素左移覆盖,相当于删除字符。具体实现我们可以定义两个指针(pFast和pSlow),初始的时候都指向第一字符的起始位置。当pFast指向的字符是需要删除的字符,则pFast直接跳过,指向下一个字符。如果pFast指向的字符是不需要删除的字符,那么把pFast指向的字符赋值给pSlow指向的字符,并且pFast和pStart同时向后移动指向下一个字符。这样,前面被pFast跳过的字符相当于被删除了。用这种方法,整个删除在O(n)时间内就可以完成。

                3,char的范围在-128-127,unsigned char的范围才是在0-255,因此ASCII值在128-255之间的字符,如果保存为了char型,其转化为int值的范围是在-128--1之间,需要转化成正值下标。

根据以上思路写出的代码如下:

#define MAX 256
char* DeleteChars(char *str1, char *str2)
{
	if (str1 == NULL || str2 == NULL)
		return NULL;

	bool hashtable[MAX];
	memset(hashtable, 0, sizeof(hashtable));
	while (*str2 != '\0')
	{
		int index;
		if (*str2 >= 0)
		{
			index = *str2;
		}
		else
		{
			index = *str2 + 256;
		}
		hashtable[index] = true;
		++str2;
	}


	char *pFast = str1;
	char *pSlow = str1;
	while (*pFast != '\0')
	{
		int index;
		if (*pFast >= 0)
		{
			index = *pFast;
		}
		else
		{
			index = *pFast + 256;
		}

		if (hashtable[index])
			*pSlow++ = *pFast;
		pFast++;
	}
	*pSlow = '\0';
	return str1;
}
int main()
{

	char str1[] = "Welcome CVTE ";
	char str2[] = "KEem";
	char* str=DeleteChars(str1, str2);
	cout<<str;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38936579/article/details/81149878