剑指Offer替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%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/p/3052309.html