经典算法题-基础-替换字符串中的空格

目录

  • 问题描述
  • 解题思路
  • 相关代码

问题描述

题目描述
请实现一个函数,把字符串中的每个空格替换成“%20”

要求
时间限制:1秒
空间限制:32768K

方法原型

public void replaceSpace(char[] str)

输入输出例子
输入:“Wa are happy” 输出:“We%20are%20happy”

解题思路

此题最自然的思路,就是从字符串的开始遍历,寻找空格,当遇到空格时,就将空格替换为"%20",因为%20占3个字符,空格占一个字符,因此空格后的所有字符需要整体后移。
此思路示意如以下动图:

但是不难发现,以上解法过程中,有一部分字符被移动了多次(如happy),这使得该算法的时间复杂度为\(O(n^2)\),当字符串较长,空格较多时,很容易超时。
为了尽量降低时间复杂度,我们可以对遍历、替换的策略进行改进:

  • 先遍历一遍字符串,获取空格的总数目
  • 知道空格的总数目后,就可以知道替换空格为"%20"所需的额外空间,进而知道【替换后的】字符串的结尾坐标
  • 从尾部开始遍历待替换的字符串,遇到空格后:将空格后至尾部的所有字符整体移动到尾部,并紧挨其填充%20
  • 更新尾部的位置

以上算法如下图所示:

这种解法的时间复杂度为\(O(n)\),空间复杂度为\(O(1)\)。

相关代码

我们给出后一种思路的JAVA版本的实现。

package com.shellmad;

public class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();
        char[] str = {'W', 'e', ' ', 'a', 'r', 'e', ' ', 'h', 'a', 'p', 'p', ' ', '\0'};
        solution.replaceSpace(str);
        System.out.println(str);
    }

    public void replaceSpace(char[] str) {

        // 检查输入
        if (str == null || str.length == 0) {
            return;
        }

        /*
            统计空格的个数
            获得源字符串终点下标
            获得替换空格后的字符串的终点下标
         */
        int srcEnd = 0;
        int destEnd = 0;
        int spaceCount = 0;

        while (str[srcEnd] != '\0' && srcEnd < str.length - 1) {
            if (str[srcEnd] == ' ') {
                spaceCount++;
            }
            srcEnd++;
        }
        srcEnd--;
        destEnd = spaceCount * 2 + srcEnd;

        if (spaceCount == 0 || destEnd >= str.length) {
            return;
        }

        // 替换空格
        while (srcEnd >= 0) {

            if (str[srcEnd] == ' ') {
                str[destEnd--] = '0';
                str[destEnd--] = '2';
                str[destEnd--] = '%';

            } else {
                str[destEnd--] = str[srcEnd];
            }

            srcEnd--;
        }
    }
}

原文地址:https://www.cnblogs.com/shellmad/p/11640771.html

时间: 2024-11-08 19:04:31

经典算法题-基础-替换字符串中的空格的相关文章

算法题之统计字符串中出现最多的字母

算法题之统计字符串中出现最多的字母 代码: <script> var arr = []; function txt(str) { var j = 0; for(var i = 0; i < str.length; i++) { if(arr.indexOf(str[i]) == -1) { arr.push(str[i]); } } for(var j = 0; j < arr.length; j++) { var s = arr[j]; var dd = str.split(s)

替换字符串中的空格

题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 输入: 每个输入文件仅包含一组测试样例. 对于每组测试案例,输入一行代表要处理的字符串. 输出: 对应每个测试案例,出经过处理后的字符串. 样例输入: We Are Happy 样例输出: We%20Are%20Happy -------------------------------------------------

每日一题11:替换字符串中的空格

用指定的字符或字符串替换某个字符串中出现的所有空格,当用字符替换字符是,自然是很简单的,但是当使用字符串替换字符时,如果还是从前往后遍历,遇到指定字符就将其后所有字符往后移出足够空间的话,当字符串中的空格很多时,反复的移动字符会带来性能上的损失.但是如果是从后往前遍历呢?可以先遍历一次原字符串,得到字符串中空格的个数,然后就可以计算出实际需要的空间,再假设原字符串所在缓冲区有足够空间(否则新建一个缓冲区从前往后遍历就行了,这里说的是在不新建缓冲区的情况下做这件事),那么就可以计算出每个字符最后的

C++用%20替换字符串中的空格(O(n)的时间效率)

#include <iostream> #include <malloc.h> #include <string.h> using namespace std; //将字符串中的空格用%20替换. void Grial(char *str) { if(str==NULL)return ; char *p = str; char *q = NULL; char buf[strlen(str)+1]; int count = 0;//计数空格数. while(*p!='\0

(CSDN迁移)替换字符串中的空格

题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. public class Solution { public String replaceSpace(StringBuffer str) { String string = str.toString(); return string.replaceAll(" ", "%20"); }

关于替换字符串中的空格问题

题目:实现一个函数,要求吧字符串中的所有空格替换成"%20".例如把"hello world"  变成  "hello%20world". 分析:我们可能会有三种方法: (1).创建一个新的数组,让其遇到空格就变成"%20",显然这种方法可以实现,但其也会浪费空间,所以这种方法也并不是很好. (2).在原有的基础上进行替换,当然前提是数组空间是足够的,然后就要想是从前往后还是从后向前,如果是从前向后进行替换的换的话,那后面的字

替换字符串中的空格(C++/Java实现)

题意描述:实现一个函数把字符串中的每个空格替换成"20%".例如: 输入:"we are happy" 输出:"we%20are%20happy" 解题思路:(C++实现方法)如果从前往后遍历,遇到空格再将字符向后移动,则假设有O(n)个空格的时间效率就是O(n^2).因此优化的解法就是一次移到位,先遍历一次字符串,可同时得到字符串的长度和字符串中空格的数量,然后对于1个空格用"%20"这3个字符替换,所以可以计算出最终字符串

经典算法题-基础-二维数组中的查找

目录 问题描述 解题思路 相关代码 问题描述 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 要求 时间限制:1秒 空间限制:32768K 方法原型 public boolean find(int target, int [][] array) 输入输出例子 在以下二维数组中 { {1,2,8,9}, {2,4,9,12}, {4,7,10,

每天一道算法题(35)——删除字符串首尾的空格

题目: 输入字符串,删除首尾的空格.单词中间只留下一个空格. 如输入"   a    b    c   "输出"a b c" 代码: public static String test1(String s) { StringBuffer sb=new StringBuffer(s.trim()); int j=0; int i; for(;j<sb.length();){ i=j; while(sb.charAt(j)==' '&&j<s