剑指offer剖析__空格替换字符串问题

问题:在"we are happy"这个字符串中,将所有的空格替换成字符串%20.

分析:如果我们不定义一个新的字符数组,就在原字符数组中进行替换,要将一个字节的空格替换成三个字节的字符数组%20,这会产生数组的越界访问,如果允许我们开辟一个新的空间来存放替换后的字符串,则问题将会变得非常简单。
设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。

#include <stdio.h>
#include <string.h>
#include <assert.h>
char *Instead(const char *strSrc, char *strDes)
{
assert(strSrc != NULL && strDes != NULL);
char *p=strDes;
char *pDes;
const char *pSrc;
pDes = strDes;
pSrc = strSrc;

while (*pSrc != '\0')
{
if (*pSrc != ' ')
{
*pDes++ = *pSrc;    //拷贝原字符串内容

}
else
{
memcpy(pDes, "%20", 3);    //遇到空格在替换后的那个字符数组中插入%20
pDes += 3;
}
pSrc++;
}
*pDes = '\0';
return p;
}

int main()
{
char s[] = "we are happy";
char s2[20];
char *p;
p = Instead(s, s2);
printf("%s",p);
return 0;
}

但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。

如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。

      1.首先遍历原字符串,找出字符串的长度以及其中的空格数量,

      2.根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。

      3.设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。

      4.如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”

      5.直到point1==point2时表明字符串中的所有空格都已经替换完毕。

代码如下:

char* Instead1(char *str, int sz,int len)
{
                 char *pstr = str ;
                 int blank_count = 0;
                 int k;
                 int point1, point2;
                 while (*pstr)
                {
                                 if (*pstr == ' ' )
                                                blank_count++;
                                pstr++;
                }
                k = len + blank_count *2;
                point1 = len;
                point2 = k;
                 str[k + 1] = '\0' ;
                 while (point1 >= 0 && point2 >= point1)
                {
                                 if (str [point1] != ' ')
                                                 str[point2--] = str [point1--];
                                 else
                                {
                                                 str[point2--] = '0' ;
                                                 str[point2--] = '2' ;
                                                 str[point2--] = '%' ;
                                                point1--;
                                }

                }
                 return str ;
}

int main()
{
                 char s[20] = "we are happy" ;
                 char *p;
                p = Instead1(s, sizeof(s)/sizeof (s[0]),strlen(s));
                printf( "%s", p);
                 return 0;

}

博主初学小白,欢迎大家积极给出意见,一起讨论,一起进步。

时间: 2025-01-15 14:14:54

剑指offer剖析__空格替换字符串问题的相关文章

剑指offer系列源码-替换空格

题目1510:替换空格 时间限制:1 秒内存限制:128 兆特殊判题:否提交:7383解决:1889 题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 输入: 每个输入文件仅包含一组测试样例. 对于每组测试案例,输入一行代表要处理的字符串. 输出: 对应每个测试案例,出经过处理后的字符串. 样例输入: We Are Happy 样例输出: We%20Are%20Happ

剑指offer第二题:替换空格(python)

题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 先计算出新字符串的长度,再从后向前替换空格,这样时间复杂度最少,为O(n).通过列表来操作替换,最后将列表组合成字符串. class Solution: # s 源字符串 def replaceSpace(self, s): # write code here if not isinstance(s, str) or

剑指Offer解题报告(Java版)——字符串转换为数字 49

? ? 引言 ? ? STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界 ? ? 分析问题 ? ? 如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数 ? ? 然后就是字符串中有可能第一

《剑指Offer》:移除字符串中重复的字符

题目: 移除字符串中重复的字符, 如abcadc移除后变为abcd, 注意:可以额外定义一两个变量,但不允许额外开辟一个数组. 思路 这里要求了空间复杂度为O(1),那我们只能用最简单的遍历方法,先让第一个字符与后面的字符一一比较,遇到重复的就把重复的字符用'\0'替换掉,再让第二个字符与右面的字符一一比较,遇到重复的,就把重复的字符用'\0'代替,如此循环,直到最后一个字符,当然同时还要在每次遇到'\0'时(重复字符出现的位置,已被填充为'\0'),将后面的字符移到前面来,替换掉'\0',最后

剑指offer系列39:把字符串转换成整数

主要代码其实很少,主要是对各种情况的判断.在做题的时候一定要考虑到各种情况的非法输入. 1.前面的空格需要跳过 2.判断数字的正负号并记录 3.如果有非法输入例如字母和其他非数字和正负号的字符,退出返回0 4.返回的是一个数字,所以一定要考虑数字的边界问题 5.对于各种情况考虑到之后最好再加一个无条件的输出语句,防止没有考虑到的情况发生 1 class Solution { 2 public: 3 int StrToInt(string str) { 4 if (str.empty()) 5 r

《剑指offer》表示数值的字符串

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+10

【剑指offer】二十、字符串的排列

题目描述 输入一个字符串,按照字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 分析:全排列问题属于典型的递归问题,对于递归问题,我们首先要做的是找到递归函数的出口,即递归终止条件,找出f(n)和f(n-1)之间的关系,我们f(n)为将第n个字符插入到n-1个字符的任何一个排列的任意一个位置上.求出所有权排列后再对其进行字典排序. 代码如下所示: 1 import java.util.Ar

《剑指Offer》:移除字符串中重复的字符_2

题目 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为abcd, 要求:时间复杂度尽可能小 与上篇博文(http://blog.csdn.net/u010412719/article/details/48086641)不一样的地方是:虽然都是移除字符串中重读的字符,但是这里的要求是时间复杂度尽可能小,对空间没有要求. 思路 思路:要求时间复杂度尽可能小而对空间没有限制,这就需要我们用控件换取时间 /* 移除字符串中重复的字符,字符串由小写字母构成 如abcadc移除后变为a

剑指offer:表示数值的字符串

题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值. 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是. class Solution: def isNume