题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
在原来的字符串上替换,并保证输入的字符串后面有足够的空余内存。
思路:
解法一:最容易想到的就是当遇到空格时,将后面的字符向后面移动2位。此方法的时间复杂度为O(N^2)。
解法二:
首先遍历字符串,统计字符串中的空格数目,计算新的字符长度 newLen = oldLen + 2 * 空格数;
依次从字符串后面开始复制,分别用p1,p2指向旧新字符串的末尾,当遇到空格时,依次赋值‘0’,‘2’,‘%’;当p1 == p2时,过程终止(p1,p2之前的都是相同的,不用再复制)。此方法时间复杂度为O(N)。
code:
1 //len 为字符数组str的总容量
2 void ReplaceBlank(char *str, int len)
3 {
4 if (str == NULL || len <= 0)
5 {
6 return ;
7 }
8 //oldLen为字符串str的实际长度
9 int oldLen = 0;
10 int NumberOfBlank = 0;
11 int i = 0;
12 while (str[i] != '\0')
13 {
14 ++oldLen;
15 if (str[i] == ' ')
16 {
17 ++NumberOfBlank;
18 }
19 ++i;
20 }
21 //newLen 为把空格替换成'%20'之后的长度
22 int newLen = oldLen + 2 * NumberOfBlank;
23 if (newLen > len)
24 {
25 return;
26 }
27
28 int indexOfOriginal = oldLen;
29 int indexOfnew = newLen;
30 while (indexOfOriginal >= 0 && indexOfnew > indexOfOriginal)
31 {
32 if (str[indexOfOriginal] == ' ')
33 {
34 str[indexOfnew--] = '0';
35 str[indexOfnew--] = '2';
36 str[indexOfnew--] = '%';
37 }
38 else
39 {
40 str[indexOfnew--] = str[indexOfOriginal];
41 }
42 --indexOfOriginal;
43 }
44 }
相关题目:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有数字是排序的。(假设A1和A2中已有数据均不含0)
基本思想和上面题目一致。利用0作为结尾标记,并从后面开始复制,避免了从前面复制引起的数据移动。
code:
1 //len1,len2分别为数组A1,A2的总长度, 返回合并后A1的实际长度
2 int MergeArray(int *A1, int *A2, int len1, int len2)
3 {
4 if (A1 == NULL || A2 == NULL || len1 <= 0 || len2 <= 0)
5 {
6 return -1;
7 }
8 int lenOfA1 = 0;
9 int lenOfA2 = 0;
10 int i = 0;
11 //计算A1的现有长度
12 while (A1[i] != 0 && i < len1)
13 {
14 ++lenOfA1;
15 ++i;
16 }
17 i = 0;
18 //计算A2的现有长度
19 while (A2[i] != 0 && i < len2)
20 {
21 ++lenOfA2;
22 ++i;
23 }
24 //A1合并后的长度
25 int newlenOfA1 = lenOfA1 + lenOfA2;
26 if (newlenOfA1 > len1)
27 {
28 return -1;
29 }
30
31 int indexOfOriginal = lenOfA1 - 1;
32 int indexOfnew = newlenOfA1 - 1;
33 int indexOfA2 = lenOfA2 - 1;
34
35 while (indexOfnew >= 0 && indexOfnew > indexOfOriginal)
36 {
37 //indexOfnew == indexOfOriginal对应A2元素已用完
38 //A1已有元素已用完
39 if (indexOfOriginal < 0)
40 { //A2剩余元素全赋值到A1中
41 while (indexOfA2 >= 0)
42 {
43 A1[indexOfnew--] = A2[indexOfA2--];
44 }
45 }
46
47 if (A1[indexOfOriginal] < A2[indexOfA2])
48 {
49 A1[indexOfnew--] = A2[indexOfA2--];
50 }
51 else
52 {
53 A1[indexOfnew--] = A1[indexOfOriginal--];
54 }
55 }
56 return newlenOfA1;
57 }

来源:https://www.cnblogs.com/ivorfeng/archive/2013/04/30/3052309.html