4. 替换空格(字符数组)

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为”We Are Happy.“则经过替换之后的字符串为“We%20Are%20Happy.”

解析

直观的想法是,新建一个数组,逐个复制,遇到空格时,写入%20,但这需要占用额外空间。

如果我们顺序的遍历字符串,当遇到空格时,用%20替换空格,这将覆盖掉空格后面的字符

如果覆盖前,后移剩余字符串,那么移动的时间复杂度为O(n^2).

采用从后往前复制字符的方法。首先统计空格的个数,计算出新字符串的长度,然后用2个指针,1个指向新字符串尾,1个指向旧字符串尾,两指针同步向前,旧指针遇到空格时,新索引指针按地址写入%20,当新旧指针相等时说明已经替换完全部空格。

实现

void ReplaceBlank(char string[], int length){
    //判断传参是否有效
    if(string==NULL || length<=0)
        return;
    //计算字符串的长度,计算空格个数
    int oldLength = 0;
    int numberOfBlank = 0;
    for(int i=0; string[i]!=‘\0‘; i++){
        oldLength++;        //字符长度不包括字符串结束符
        if(string[i] == ‘ ‘)
            numberOfBlank++;
    }
    //判断原有字符数组是否能容纳新的字符串
    int newLength = oldLength + numberOfBlank * 2;
    if(newLength >= length)
        return;
    //替换空字符
    int indexOld = oldLength;
    int indexNew = newLength;
    while(indexOld != indexNew){
        if(string[indexOld] == ‘ ‘){
            string[indexNew--] = ‘0‘;
            string[indexNew--] = ‘2‘;
            string[indexNew--] = ‘%‘;
            indexOld--;
        }else{
            string[indexNew--] = string[indexOld--];
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 11:21:59

4. 替换空格(字符数组)的相关文章

字符数组中将空格移到最后java实现

最近遇到一个题:一个字符数组中,里边有字母和空格,那么需要将所有空格移动到后边,前边的字母按顺序连续排在一起, 解法1:两层循环,嵌套比对,这种比较笨,我当时面试就是用的这种,时间复杂度为 N方. 解法2:使用两个游标,从第一个元素开始,如果遇到字母,那么两个游标同时移动,如果遇到空格,其中的第一个游标继续移动,第二个游标停止移动,交换元素,再将第二个游标移动,时间复杂度为 N. 下边的时代码 /** * 移动空格: * 一个字符数组中,里边又字母和空格,此时需要将空格全部挪到数组的后边,字符按

C++中字符数组和字符串string

字符数组 C++中字符数组用char str[]可以用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,因为系统会自动补上一个'\0'作为字符串的结束标志.当然对于未初始化的也补'\0'. #include <iostream> #include <string> using namespace std; int main() { char str[11] = "I am happy"; // 系统会自动补上'\0'空

剑指offer二:替换空格

题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路: 本题中需要注意,新的字符串的长度要比旧的字符串长度长,这意味着,从前往后替换的话,每更换一次,后面的字符就要向后移动.因此,在替换的过程中需要考虑到时间复杂度和空间复杂度的问题. public class Solution { public String replaceSpace(StringBuffer s

替换空格 4

先遍历每个字符统计空格数 :String.charAt() ? ? 根据空格数计算新的长度 :newLength=oriLength+2*NumOfBlank ? ? 新建一个newLength长度的字符数组tempChars用于存放替换空格之后的字符数组 ? ? 利用System.arraycopy函数将原字符串转换为数组拷贝到新的字符数组tempChars中 ? ? 从新字符数组末尾开始遍历,用一个index1指向新字符数组末尾,用一个index2指向原字符数组末尾所在新字符数组的位置,将原

Pro4 替换空格

本题最大的困难是如何在不新建新的数组下完成空格替换,主要考察数组指针的运用 思路:(1)找出字符串空格的长度,从而确定新的子串尾指针的位置所在: (2)通过遍历找出空格,string[indexOfNew--]依次附上%20三个字符,indexOfOriginal-- 注:并没有通过实际指针而是通过字符串下标操作,起始时均指向末尾位置 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /

C++中的替换空格

例,请实现一个函数,把字符串中的每个空格替换成"%20".例如输入"We are happy.",则输出"We%20are%20happy.". 分析: 我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度.每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目.我们还是以前面的字符串'We are happy,"为例,"We are happy'&

剑指offer:替换空格

##题目:请实现一个函数,把字符串中的每个空格替换成%20.例如输入"We are happy.",则输出"We%20are%20happy.". 最容易想到的是,从头到尾扫描,每次碰到空格就替换.但是时间复杂度为o(n2). 时间复杂度为o(n)的解法是: 首先遍历字符串,统计出字符串中空格的总数,然后计算出替换之后的字符串的总长度.然后准备2个指针,P1,P2,.P1,指向原串的末尾,P2指向新串的末尾.然后向前移动,逐个把P1指向的字符复制到P2指向的位置,遇

RSA加密解密 错误:Base-64 字符数组的无效长度

文章1.程序中实现了这样一个功能,将一个对象序列化后,作为参数传递给另一个页面,这个页面得到参数并反序列化后还原此对象,但是在运行时有时正常,有时出现“base-64 字符数组的无效长度”的错误提示. 在网上查找资料,都是说在使用Convert.ToBase64String()方法对字符串进行Base64编码时,需要使参数的长度等于4或4的偶数倍数,否则将抛出“FormatException”异常.但是我这里使用的参数是使用Convert.ToBase64String()方法生成的,理论上是没有

字符串字符数组

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 8 /* 9 字符串的赋值: 10 给 char* 类型的字符串赋值,可以直接使用 "=" 号 11 给 char[] 类型的字符串赋值,需要使用 strcpy 函数 12 13 字符串的特点: 14 需要明白的一点就是字符串以\0结尾, 没有\0就不是字符串 15 只