秦怀杂货店

General Store

  • 首页
  • 文章归档
  • 标签
  • 分类
  • 关于页面

  • 搜索
随便聊聊 数据结构 小游戏 数据库 Docker Springboot 系统设计 雪花算法 分布式 海量ip 最长回文子串 算法 面试题 线程池 多线程 线程 java学习 布隆过滤器 github 架构设计 docsify Git JVM LeetCode 杂货思考 设计模式 Lambda native isAssignableFrom 反射 剑指Offer mybatis SPI JDBC 编程工具 Java基础 集合

剑指Offer【2】--替换空格

发表于 2020-11-03 | 分类于 剑指Offer | 0 | 阅读次数 243

[toc]

题目描述

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

java直接调用函数

java里面有可以直接使用的函数replace(),直接写成下面这样即可通过,但是这样真的没有意思啊。🤣🤣🤣

public String replaceSpace(StringBuffer str) {
    String result = str.toString().replace(" ","%20");
    return result;
}

java实现功能

于是乎,决定自己实现,不直接调用api.思路如下:

  • 1.将字符串转换成为字符数组,遍历一次,统计出空格的个数。
  • 2.构建出新的字符数组,初始化的大小=原来的字符数组长度+空格长度x2
  • 3.遍历一次,复制,当不为空格时直接复制,当为空格时,则把%20这三个字符复制过去。
public class Solution {
    public String replaceSpace(StringBuffer str) {
        // 转换成为字符数组
        char[] originChars= str.toString().toCharArray();
        int spaceNum = 0;
        // 计算出空格的个数
        for (int i = 0; i < originChars.length; i++) {
            if (originChars[i] == ' ') {
                spaceNum++;
            }
        }
        // 新字符数组的长度
        int newCharsLength = originChars.length + 2 * spaceNum;
        char[] newChars = new char[newCharsLength];
        int newStrIndex = 0;
        for (int index= 0; index<=originChars.length - 1; index++) {
            if(originChars[index] != ' '){
                // 直接复制
                newChars[newStrIndex++] = originChars[index];
            }else {
                // 空格则需要复制三个字符
                newChars[newStrIndex++] = '%';
                newChars[newStrIndex++] = '2';
                newChars[newStrIndex++] = '0';
            }
        }
        // 转成字符串
        return new String(newChars);
    }
}

c++实现功能

c++实现差不多,主要是复制的时候从后面往前面开始复制,这样就可以节省一定空间,直接在原来的数组上操作。不需要重新创建一个空间。

class Solution {
public:
    	void replaceSpace(char *str,int length) {
		if(str == NULL || length <= 0){
            return;
        }
        int originalLength = 0;
        int spaceNum = 0;
        int i;
        while(str[i++] != '\0'){
            ++originalLength;
            if(str[i] == ' '){
                ++spaceNum;
            }
        }

        int newCharsLength = originalLength + 2 * spaceNum;
        
        int indexOriginal = originalLength-1;
        int index = newCharsLength-1;
        
        while(indexOriginal >= 0 && index > indexOriginal){
            if(str[indexOriginal] == ' '){
                str[index--] = '0';
                str[index--] = '2';
                str[index--] = '%';
            }
            else{
                str[index--] = str[indexOriginal];
            }
            --indexOriginal;
        }
    }
};
  • 本文作者: 秦怀杂货店
  • 本文链接: http://aphysia.cn/archives/jianzhioffer2
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 随便聊聊 # 数据结构 # 小游戏 # 数据库 # Docker # Springboot # 系统设计 # 雪花算法 # 分布式 # 海量ip # 最长回文子串 # 算法 # 面试题 # 线程池 # 多线程 # 线程 # java学习 # 布隆过滤器 # github # 架构设计 # docsify # Git # JVM # LeetCode # 杂货思考 # 设计模式 # Lambda # native # isAssignableFrom # 反射 # 剑指Offer # mybatis # SPI # JDBC # 编程工具 # Java基础 # 集合
剑指Offer【1】--二维数组中的查找
剑指Offer【3】--从尾到头打印链表
  • 文章目录
  • 站点概览
秦怀杂货店

秦怀杂货店

纵然缓慢,驰而不息。

145 日志
19 分类
37 标签
Github E-mail
Creative Commons
0%
© 2022 秦怀杂货店
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4