牛客网《剑指Offer》编程 2.替换空格

关于字符串的知识:

运行以下代码,查看结果:

void test() {
	char str1[] = "helloworld";
	char str2[] = "helloworld";
	char* str3 = "helloworld";
	char*str4 = "helloworld";
	if (str1 == str2) { cout << true << endl; }
	if (str1 != str2) { cout << false << endl; }
	if (str3 == str4) { cout << true << endl; }
	if (str3 != str4) { cout << false << endl; }
}
int main()
{	
	test();
	return 0;
}

结果是0和1。

因为str1和str2是字符串,系统会为它们各自分配长度为12的空间,然后将"helloworld"字符串分别复制到两个空间里面去,str1和str2是两个初始地址不同的数组,因此比较结果是不同的。

str3和str4是两个指针,系统没有必要为他们分配空间存储内容。str3和str4都指向"helloworld"字符串的的首地址。由于它们指向的是同一个地址,因此比较结果是相同的。

既然==比较的是地址,那么如何进行两个字符串之间的比较呢?可以用strcmp(const char* str1,const char* str2)函数进行比较,也可以自定义函数逐个字符进行比较。

题目:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:

1.重新设置一个空的字符串,在将原字符串复制到新字符串中的同时,将“%20”顺便插入新的字符串。

2.通过移动的方式,在原字符串上进行更改。为了减少移动次数,将从后向前进行移动。

遍历字符串,计算字符串的长度(不包括'\0'),同时计算更改后字符串的长度

设置两个指针p和q,分别指向更改前字符串的末尾和更改后字符串的末尾,移动包括'\0'。

当p!=q时,进行如下操作:

           如果此时*p不为空格,将*p复制给*q;

           如果此时*p为空格,以q为起始位置,依次插入'0','2','%'。

注意p与q的下标。

代码如下:

void replaceSpace(char *str,int length) {
        int i = 0;
	int num_space = 0;
	int orginal_length = 0;
	//先统计空格的数量
	while (*(str+i)!='\0') {
		++orginal_length;
		if (*(str+i)==' ') { ++num_space; }
		i++;
	}
	//根据空格的数量计算出目标字符串的长度
	char* p =str+ orginal_length;
	int new_length = orginal_length + 2 * num_space;
	char* q =str+ new_length;
	if (new_length +1 > length) { return; }
	while (p!=q) {
		while(*p!=' '){
            *q--=*p--;
        }
        if(*p==' '){
            *q--='0';
            *q--='2';
            *q--='%';
        }
        p--;
	}
	}

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82224628