面试题【002字符串替换空格】精妙解法

题目描述

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

解题思路

老实说,看到这个题目想到的就是字符串替换,但是面试题肯定不是这么简单的,那么怎么在原字符串上进行高效的替换呢?我们的字符串替换,主要的消耗是在移位上,每遇到一个空格,后面的字符串就往后移位,那么之前的移位都没有作用了。我们知道字符串的长度,知道替换字符串的长度,如果还知道空格的多少,那么这个字符串的长度就知道了。知道长度之后,只需要把数据放到响应的位置就可以了。
步骤:
1. 遍历字符串,统计出空格数量
2. 再遍历一次,完成替换

代码实现

普通解法,直接替换字符串

public static string ReplaceSpaceForSimple(string str)
{
    return str.Replace(" ", "%20");
}

精妙解法数据移位

public static string ReplaceSpace(string str)
{
    int count = 0;
    foreach (var item in str)
    {
        if (item == ‘ ‘)
        {
            count++;
        }
    }

    int oLength = str.Length;
    int length = oLength + count * 2; //"%20".Length-1
    char[] tempArray = new char[length]; //新开辟了一个空间
    length--;
    for (int i = oLength - 1; i >= 0; i--)
    {
        if (str[i] == ‘ ‘)
        {
            tempArray[length--] = ‘0‘;
            tempArray[length--] = ‘2‘;
            tempArray[length--] = ‘%‘;
        }
        else
        {
            tempArray[length--] = str[i];
        }
    }

    return new string(tempArray);
}

赋值给另外一个

public static string ReplaceForBS(string str) {
    StringBuilder sb = new StringBuilder();
    foreach (var item in str) {
        if (item == ‘ ‘)
        {
            sb.Append("%20");
        }
        else {
            sb.Append(item);
        }
    }
    return sb.ToString();
}

测试

中间空格

[Fact]
public void Middle()
{
    string str = "We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

开始空格

[Fact]
public void Start()
{
    string str = " We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

结束空格

[Fact]
public void End()
{
    string str = "We Are Happy. ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

多空格

[Fact]
public void More()
{
    string str = "We     Are  Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

空字符串

[Fact]
public void Empty()
{
    string str = "";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = " ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = "  ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

结果

想入非非:扩展思维,发挥想象

1. 这个题可以扩展为替换其他的数据,不要局限于单一的替换,URL就是ASCII替换
2. 字符串是一种特殊的char[]

原文地址:https://www.cnblogs.com/zhao123/p/11132036.html

时间: 2024-10-07 07:04:26

面试题【002字符串替换空格】精妙解法的相关文章

剑指offer——面试题5:替换空格

利用STL: 1 #include"iostream" 2 #include"stdio.h" 3 #include"algorithm" 4 using namespace std; 5 6 string ReplaceBlank(string src) 7 { 8 if(src.find(" ")>src.length()) 9 return src; 10 while(src.find(" ")

【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

//字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void replace(char *src) { assert(src); int OldLen = 0; //原字符串长度 int NewLen = 0; //新字符串长度 int BlackNum = 0; //空格数量 int NewBack = 0; //新字符串尾部 int OldBack = 0; //原

【c语言】字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”

// 字符串替换空格:请实现一个函数,把字符串中的每个空格替换成"%20". // 例如输入"we are happy.",则输出"we%20are%20happy." #include <stdio.h> #include <assert.h> char* replace(char* p) { char* ret = p; int num = 0; int oldlen = 0; int newlen = 0; char

C语言:字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”。

思路: 从前往后:在原基础上进行替换(当然前提是空间足够),如果从前往后遇到空格就替换,必然会对原来的字符造成覆盖,不可以实现. 因为把空格替换为"%20",每次替换多2个字符,因此可以统计出字符串中空格的总个数,然后新数组大小为  "原数组大小 + 2*空格数 ".从后往前处理:遇到非空格,直接搬到后面,遇到空格替换为"%20". 直到待插入位置指针和原数组为指针重合位置. #include<stdio.h> #include<

字符串替换空格

题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. public class solution2 { public static String replaceSpace(StringBuffer str) { //求得字符串的长度 int length=str.length(); //遍历字符串中的每一个字符,如果是空格,那么就行星替换操作 StringBuffer tempStr=

字符串替换空格-Python

题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 时间限制:1秒 空间限制:32768K 热度指数:1240896 本题知识点: 字符串 1.Python的replace方法 运行时间:36ms 占用内存:5712k # -*- coding:utf-8 -*- class Solution: # s 源字符串 def replaceSpace(self, s): # writ

剑指offer之字符串——替换空格

题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M public class Solution { public static String replaceSpace(StringBuffer str) { //健壮性判断 if (str == null) { return null

字符串替换空格:实现函数&quot;we are happy.&quot;--&gt;&gt;&quot;we%20are%20happy.&quot;

#include <stdio.h> #include <assert.h> #include <stdlib.h> void replace_space(char *str) { assert(str); char *pstr = str; int space = 0; int len = 0; int newlen = 0; while (*str) { if (*str == ' ') space++; len++; str++; } newlen = len +

字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20。

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <assert.h> void repace_black(char *str) { assert(str); char *pstr = str; int black = 0; int len = 0; int newlen = 0; while (*str) { if (*str == ' ') black++; len++; str++; } newlen