题目一:函数将字符串中的字符‘※’号移到字符串的前部分,前面的非‘※’字符后移,但不能改变非字符的先后顺序,函数返回串中非’*'字符的数量。(要求尽可能的占用少的时间和辅助空间)。例如:原始串为"au※※toc※※h※※i※ps",处理后为"※※※※※※※autochips",函数返回9。
思路:使用俩个标记 i, j 都指向字符串的末尾,然后 i 往前走,若遇到非字符则将其位置的值拷到 j 位置,然后 i, j 同时向前移动, i 走完之后,将j位置到 i 之间的位置都赋为※。
代码如下:
//字符串问题:一个换一个
int MoveSignToFroat(char* str)
{
assert(str != NULL); //参数检查
if (str == NULL)
{
return -1; //错误返回-1
}
int count = 0, result = 0;
int len = strlen(str);
int i = len;
int j = i;
while (i >= 0)
{
if (str[i] != '*')
{
str[j--] = str[i];
}
i--;
}
while (j >= 0) //赋值*
{
str[j--] = '*';
count++;
}
result = len - count;
return result;
}
测试用例:
void Print(char* str)
{
for (int i = 0; i <= (int)strlen(str); i++)
{
printf("%c ", str[i]);
}
printf("\n");
}
int main()
{
char ch[] = "au**toc**h**i*ps";
int len = sizeof(ch) / sizeof(ch[0]);
printf("原始串为:");
Print(ch);
int result = MoveSignToFroat(ch);
printf("原串里面有%d个非*字符\n", result);
printf("改变后为:");
Print(ch);
return 0;
}
时间复杂度和空间复杂度分别为:O(n),O(1)
测试结果:
题目二:将字符串中连续的※删除,只保留一个※,例如,“a※b※※c※※※d”->"a b c d"
思路:使用俩个标记 i, j 都指向字符串的开始,判断 i 位置和 i + 1 位置的值都是※吗?,若是连续※,则 i 往后走,若不是连续※,则将 i 位置的值赋给 j 位置,最后结束后将 j 位置置为’\0’.
代码如下:
void DeleteMoreBlank(char *str)//O(n),O(1)
{
int i = 0;
int j = 0;
for (; str[i] != '\0'; i++)
{
if (str[i] == '*'&& str[i + 1] == '*') //连续空格
{
//什么都不做
}
else // 不是连续空格
{
str[j] = str[i];
j++;
}
}
str[j] = '\0';
}
测试用例:
int main()
{
char str[] = "a*b**c***d";
printf("原始串为:");
printf("%s\n", str);
DeleteMoreBlank(str);
printf("删除后为:");
printf("%s ", str);
return 0;
}
时间复杂度和空间复杂度分别为:O(n),O(1)
测试结果:
题目三:请实现一个函数,把字符串中的每个空格替换成“%20"。例如输入“We are happy.", 则输出“We%20are%20happy"。
思路:若原字符串数组空间足够大,遍历字符串,可以得到空格的数目count和字符串的长度num,则替换后的总长度len = num + count * 2,然后使用 i 标记原字符串的最后一个字符,j标记len,然后str[len] = ‘\0’;字符串从后往前遍历,若是字符,拷贝到 j 位置,若是空格,则 j 位置拷贝 ‘0’、‘2’、’%’,每次拷完 j–;
代码如下:
void BlankToSign(char* str)
{
int count = 0; //统计空格的数量
int i = 0;
int j = 0;
while (str != '\0')
{
if (str[i] == ' ')
{
count++;
}
i++;
}
j = i + count * 2;
for (; i > 0; i--)
{
if (str[i] != ‘ ’)
{
str[j] = str[i];
j--;
}
else
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
}
}
测试用例:
int main()
{
char str[50] = " We are happy! ";
printf("%s\n", str);
BlankToSign(str);
printf("%s\n", str);
return 0;
}
测试结果: