字符串经典面试题

1、编码完成下面的处理函数,函数将字符串中的字符’‘移到字符串的前部分,前面的非’
字符后移,但不能改变非’‘字符的先后顺序,函数返回串中非’'字符的数量。(要求尽可能
的占用少的时间和辅助空间)。
例如:原始串为autoch**ips,处理后为******autochips,函数返回9.
(1)请用文字或流程图简要描述您的思路;
(2)请用C语言编程实现,注意时间和空间开销。

int Move1(char* str)//O(n),O(n)
{
	char* arr = (char*)malloc(strlen(str) + 1);
	assert(arr != NULL);
	int i = strlen(str);//str下标
	int j = i;//arr下标
	int rtval;//返回值
	for (; i >= 0; i--)//从后往前复制非*的字符
	{
		if (str[i] != '*')//非*,需要复制到arr中
		{
			arr[j--] = str[i];
		}
	}

	rtval = strlen(str) - j - 1;

	//前面补*
	while (j >= 0)
	{
		arr[j--] = '*';
	}

	strcpy(str, arr);//将数据复制到str中
	free(arr);

	return rtval;
}

//算法2,利用两个下标i,j分别到字符串的末尾,通过i从后往前遍历,如果i的数据为非*则将数据复制到j处,
//j往前,如果没有复制则j不动,最后将前面的部分补充为*
int Move(char* str)//O(n),O(1)
{
	int i = strlen(str);//遍历的下标
	int j = i;//数据移动后的下标
	int rtval;//返回值

	for (; i >= 0; i--)//利用i从后往前遍历字符串
	{
		if (str[i] != '*')
		{
			str[j--] = str[i];
		}
	}
	rtval = strlen(str) - j - 1;

	while (j >= 0)
	{
		str[j--] = '*';
	}
	return rtval;
}

2.将字符串中的空格替换为%20,例如"a b c"->“a%20b%20%20c”

////算法1:额外定义一个数组,从前往后遍历,遇到非空格则在新数组中添加%20,最后将新数组中的内容复制到原数组中
void Space(char* str)
{	int i = 0;
	int j = 0;//arr下标,arr用于存放调整后的字符串
	int l = strlen(str);
	int count_space = 0;//空格数量

	for (i = 0; *(str + i) != '\0'; i++)
	{
		if (*(str + i) == ' ')
		{
			count_space++;
		}
	}

	char* arr = (char*)malloc(strlen(str) + 1 +(count_space * 2));//这里空格数不确定,容易内存溢出,因此需要计算空格的数量,再申请内存
	//assert(arr != NULL);

	for (i = 0; i <= l; i++)
	{
		if (*(str+i) != ' ')
		{
			arr[j++] = str[i];
		}
		else
		{
			arr[j++] = '%';
			arr[j++] = '2';
			arr[j] = '0';
			j++;
		}
	}
	strcpy(str, arr);
	free(arr);
}
int main()
{
	char str[20] = "a b  c";
	Space(str);
	printf("%s\n", str);
	return 0;
}


//算法2:从前往后遍历一遍统计空格的数量,利用i定位到字符串末尾,j=i+空格数*2;然后从后往前遍历,非空格数则直接复制,空格则改写为%20
void Space(char* str)
{
	int i = 0;
	int count_space = 0;//空格数量
	
	//统计空格数量
	for (i = 0; *(str + i) != '\0'; i++)
	{
		if (*(str + i) == ' ')
		{
			count_space++;
		}
	}

	//定位i到字符串结尾并保存i的值
	 i = strlen(str);
	int j = i + count_space * 2;

	for (; i >= 0; i--)//利用i从后往前遍历字符串
	{
		if (str[i] != ' ')
		{
			str[j--] = str[i];
		}
		else
		{
			str[j--] = '0';
			str[j--] = '2';
			str[j] = '%';
			j--;
		}
	}
}
int main()
{
	char str[20] = "a b  c";//定义str时长度要足够
	Space(str);
	printf("%s\n", str);
	return 0;
}

3.删除字符串中多余的空格, 多个空格只保留一个.“a b c d”->“a b c d”

void Delete_Space(char* str)
{
		
	    int i;

		 char* arr = (char*)malloc(strlen(str) + 1);
		 int j  =0;
	
		 for (i = 0; str[i]!='\0'; i++)
		 {
			 if (str[i] != ' ')
			 {
				 arr[j++] = str[i];
				 arr[j++] = ' ';
			 }
		 }
		 arr[j] = '\0';
		 strcpy(str, arr);
		 free(arr);
	
	}
int main()
{
	char str[20] = "a b  c   d";
		Delete_Space(str);
		printf("%s\n", str);
		return 0;
	return 0;
}

你可能感兴趣的:(字符串经典面试题)