今天看到同学在做题,要求是:把一个字符串中的所有空格去掉,合并所有字符。例如
输入:abc 123 abc<enter>
输出:abc123abc
很简单吧!!
总结了一下,想到三种简单的处理方法:
第一种:时间复杂度为n^2,空间复杂度为n
void delete_3(char* str)
{
int i=0,j=0;
while (str[i])
{
if (str[i] == ' ')
{
j = i;
while (str[j])
{
str[j] = str[j+1];
j++;
}
}
i++;
}
}
第二种:时间复杂度为n,空间复杂度为2n
void delete_2(char *str)
{
char s[100];
int i = 0,j = 0;
while(str[i])
{
if (str[i] != ' ')
s[j++] = str[i];
i++;
}
s[j] = '\0';
i = 0;
while(s[i])
{
str[i] = s[i];
i++;
}
str[i] = '\0';
}
第三种:时间和空间复杂度都是n
void delete_1(char *str)
{
char *p = str;
int i = 0;
while(*p)
{
if (*p != ' ')
str[i++] = *p;
p++;
}
str[i] = '\0';
}
当然,最好用就是第三种,简单而且高效!当时一看到这题,我脑子里只有第一种方法。。。。。。。可能因为我单片机玩多了,总是觉得资源是很有限的,所以利用空间换时间的处理方法很少被我想到。。。。。。但第二种方法的确要快于第一种。而第三种方法我却没有想到。。。。。感觉自己好low,真得多看看,多想想才行!!!
第三种方法看起来很简单,但却是很精妙!!这为处理字符串内字符的移位,删除等提供了一个很好的想法。
比如说,删除数组中的指定元素,而这个元素可以有多个,也可能是连续的。
小东西,却很实用!