剑指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 }
不经历风雨,怎么见彩虹!