剑指offer:替换空格
##题目:请实现一个函数,把字符串中的每个空格替换成%20。例如输入“We are happy.",则输出”We%20are%20happy."。
最容易想到的是,从头到尾扫描,每次碰到空格就替换。但是时间复杂度为o(n2)。
时间复杂度为o(n)的解法是:
首先遍历字符串,统计出字符串中空格的总数,然后计算出替换之后的字符串的总长度。然后准备2个指针,P1,P2,。P1,指向原串的末尾,P2指向新串的末尾。然后向前移动,逐个把P1指向的字符复制到P2指向的位置,遇到空格,就让P1向前移动,P2插入字符串%20,然后把P2向前移动3格。
/*length 为字符数组string的总容量*/void ReplaceBlank(char string[], int length){if(string == NULL && length <= 0)return;/*originalLength 为字符串string的实际长度*/int originalLength = 0;int numberOfBlank = 0;int i = 0;while(string[i] != '\0'){++ originalLength;if(string[i] == ' ')++ numberOfBlank;++ i;}/*newLength 为把空格替换成'%20'之后的长度*/int newLength = originalLength + numberOfBlank * 2;if(newLength > length)return;int indexOfOriginal = originalLength;int indexOfNew = newLength;while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){if(string[indexOfOriginal] == ' '){string[indexOfNew --] = '0';string[indexOfNew --] = '2';string[indexOfNew --] = '%';}else{string[indexOfNew --] = string[indexOfOriginal];}-- indexOfOriginal;}}
合并两个数组的时候,如果从前往后复制的话,需要移动数字或字符多次,因此可以考虑从后往前复制。
浙公网安备 33010602011771号