zoukankan      html  css  js  c++  java
  • 字符串替换空格

    题目描述

    请实现一个函数,将一个字符串中的每个空格替换成“%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));
    }
    View Code

    开始空格

    [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));
    }
    View Code

    结束空格

    [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));
    }
    View Code

    结果

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

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

    3. 熟悉字符串string,stringbuilder

  • 相关阅读:
    mysql数据库题目【杭州多测师】【杭州多测师_王sir】
    python题目:维度为(M,N)求矩阵的转置【杭州多测师】【杭州多测师_王sir】
    python题目【杭州多测师】【杭州多测师_王sir】
    购物车测试点【杭州多测师】【杭州多测师_王sir】
    史上最全软件测试工程师常见的面试题总结【杭州多测师】【面试题】【杭州多测师_王sir】
    查询"001"课程比"002"课程成绩高的所有学生的学号【杭州多测师】【杭州多测师_王sir】
    mysql数据库查询当天,最近7天,最近1个月数据【杭州多测师】【杭州多测师_王sir】
    python题目:判断一个IP地址是否合法【杭州多测师】【杭州多测师_王sir】
    sql floor()函数
    mysql左连右连
  • 原文地址:https://www.cnblogs.com/zhao123/p/11132036.html
Copyright © 2011-2022 走看看