算法-字符串替换空格
2017-08-09 17:37
274 查看
题目:
实现一个函数,把字符串中的每一个空格替换成”%20”。例如输入”We are happy.”,则输出”We%20are%20happy.”。
解题思路:
首先我们需要先想清楚一点,函数就要求输出替换后的结果,没有说是在原数据上替换,还是可以申请内存,创建一个新的字符串?
后者可以让问题变得简单,用比较直接的方式就可以实现一个时间复杂度为O(n)的代码,首先我们先遍历一遍字符串,找到到底有多少个空格以计算出替换后的长度,在上面的例子中,替换前是14,替换后是18,创建一个长度为18的数组,然后我们只要在从头遍历一次原字符串,没有出现空格就直接复制原字符串的内容,出现空格了就写入”%20”:
虽然这种方法得到了一个时间复杂度为O(n)的算法,但是一样牺牲了空间复杂度啊,要是我们只考虑在原数据上替换,而不新建数组呢?
那么这里有个前提条件,我们只能认为题目中给我们的数组长度是大于等于18的,要不然就会放不下,所以我们还可以先计算一下替换后的长度,然后加个判断,如果发现原数组长度不够,那就直接return好了,这样就可以成功甩锅!
假设原始数据是这样的(最起码也要是这样):
如果我们还是从前到后的遍历的话,时间复杂度就会变成O(n^2),因为每次遍历到空格的时候,还会带动着其他的数据向后移动:
所以,有没有什么办法能够兼顾时间复杂度和空间复杂度呢??
用直接修改原数据的方法,从后向前替换空格!就酱:
这种方法的话,计算替换后的长度就有了一个新的作用,它告诉我们原数据中最后一位放在新数据的哪一位。
代码实现:
实现一个函数,把字符串中的每一个空格替换成”%20”。例如输入”We are happy.”,则输出”We%20are%20happy.”。
解题思路:
首先我们需要先想清楚一点,函数就要求输出替换后的结果,没有说是在原数据上替换,还是可以申请内存,创建一个新的字符串?
后者可以让问题变得简单,用比较直接的方式就可以实现一个时间复杂度为O(n)的代码,首先我们先遍历一遍字符串,找到到底有多少个空格以计算出替换后的长度,在上面的例子中,替换前是14,替换后是18,创建一个长度为18的数组,然后我们只要在从头遍历一次原字符串,没有出现空格就直接复制原字符串的内容,出现空格了就写入”%20”:
虽然这种方法得到了一个时间复杂度为O(n)的算法,但是一样牺牲了空间复杂度啊,要是我们只考虑在原数据上替换,而不新建数组呢?
那么这里有个前提条件,我们只能认为题目中给我们的数组长度是大于等于18的,要不然就会放不下,所以我们还可以先计算一下替换后的长度,然后加个判断,如果发现原数组长度不够,那就直接return好了,这样就可以成功甩锅!
假设原始数据是这样的(最起码也要是这样):
如果我们还是从前到后的遍历的话,时间复杂度就会变成O(n^2),因为每次遍历到空格的时候,还会带动着其他的数据向后移动:
所以,有没有什么办法能够兼顾时间复杂度和空间复杂度呢??
用直接修改原数据的方法,从后向前替换空格!就酱:
这种方法的话,计算替换后的长度就有了一个新的作用,它告诉我们原数据中最后一位放在新数据的哪一位。
代码实现:
//length就是数组创建时候的长度 void ReplaceBlank(char string[], int length) { if(string == NULL && length <= 0) return; //实际有数据的长度 int originalLength = 0; int numberOfBlank = 0; int i = 0; while(string[i] != '\0') { ++ originalLength; if(string[i] == ' ') ++ numberOfBlank; ++ i; } //替换之后,新的数据需要的长度 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; } }
相关文章推荐
- 算法之每日一题:替换字符串空格
- 【面试算法系列】替换字符串中的空格为其他字符 - C语言实现
- [面试] 算法(五)—— 替换字符串中的空格
- 算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)
- 算法:替换字符串中的空格
- 算法学习记录二(C++)--->字符串空格替换
- 【我的算法日记】请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。
- 算法--替换字符串的空格为指定字符
- 字符串替换空格的最优算法
- 字符串替换空格算法
- java 不复制字符串前提下替换字符串中的空格算法实现O(n)
- 字符串中空格替换为%20(算法)
- 算法爱好者——算法题:替换字符串中的空格 ? 待解决
- 字符串的空格替换算法
- 【Java】编写一个方法,将字符串中的空格全部替换为“ ”
- 请实现一个函数,将一个字符串中的空格替换成“ ”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We Are Happy。
- 请实现一个函数,把字符串中的每个空格替换成“%20”
- 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- 字符串的空格替换
- 把字符串中的每个空格替换成“ ”,要求在原字符串上直接替换。(假设原字符串有足够空间)