前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer | 面试题4:替换空格

剑指offer | 面试题4:替换空格

作者头像
千羽
发布2021-12-29 13:01:20
2410
发布2021-12-29 13:01:20
举报
文章被收录于专栏:程序员千羽

死磕算法系列文章

  1. 干货 | 手撕十大经典排序算法
  2. 剑指offer | 认识面试
  3. 剑指offer | 面试题2:实现Singleton模式
  4. 剑指offer | 面试题3:二维数组的查找

剑指 Offer 面试题4. 替换空格

LeetCode:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof

GitHub:https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_04_replaceSpace/Solution.java

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

代码语言:javascript
复制
输入:s = "We are happy."
输出:"We%20are%20happy."

限制:0 <= s 的长度 <= 10000

方法一:遍历添加

“遇到空格就在后面添加“ %20

字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。

算法流程:

  • 初始化一个 list (Python) / StringBuilder (Java) ,记为 res ;
  • 遍历列表 s 中的每个字符 c :
    • 当 c 为空格时:向 res 后添加字符串 "%20" ;
    • 当 c 不为空格时:向 res 后添加字符 c ;
    • 将列表 res 转化为字符串并返回。

复杂度分析:

  • 时间复杂度 O(N) :遍历使用O(N) ,每轮添加(修改)字符操作使用 O(1) ;
  • 空间复杂度 O(N): 新建的 StringBuilder 都使用了线性大小的额外空间。
代码语言:javascript
复制
package com.nateshao.sword_offer.topic_04_replaceSpace;

/**
 * @date Created by 邵桐杰 on 2021/11/15 23:12
 * @微信公众号 程序员千羽
 * @个人网站 www.nateshao.cn
 * @博客 https://nateshao.gitee.io
 * @GitHub https://github.com/nateshao
 * @Gitee https://gitee.com/nateshao
 * Description: 替换空格
 */
public class Solution {
    public static void main(String[] args) {
        String str = "We Are Happy";
        String s = replaceSpace(str);
        System.out.println(s);
    }

    public static String replaceSpace(String s) {
        StringBuilder res = new StringBuilder();
        for (Character c : s.toCharArray()) {
            if (c == ' ') res.append("%20");
            else res.append(c);
        }
        return res.toString();

//        if (s == null)
//            return null;
//        StringBuilder sb = new StringBuilder();
//        for (int i = 0; i < s.length(); i++) {
//            if (String.valueOf(s.charAt(i)).equals(" ")) {
//                sb.append("%20");
//            } else {
//                sb.append(s.charAt(i));
//            }
//        }
//        return String.valueOf(sb);
    }
}

方法二:字符数组

“由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。

  • 获得 s 的长度 length
  • 创建字符数组 array,其长度为 length * 3
  • 初始化 size 为 0,size 表示替换后的字符串的长度
  • 从左到右遍历字符串 s
    • 获得 s 的当前字符 c
    • 如果字符 c 是空格,则令 array[size] = '%',array[size + 1] = '2',array[size + 2] = '0',并将 size 的值加 3
    • 如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1
  • 遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串

复杂性分析

  • 时间复杂度:O(n)。遍历字符串 s 一遍。
  • 空间复杂度:O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。
代码语言:javascript
复制
 /**
     * 方法二:字符数组
     * @param s
     * @return
     */
    public String replaceSpace2(String s) {
        int length = s.length();
        char[] array = new char[length * 3];
        int size = 0;
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c == ' ') {
                array[size++] = '%';
                array[size++] = '2';
                array[size++] = '0';
            } else {
                array[size++] = c;
            }
        }
        String newStr = new String(array, 0, size);
        return newStr;
    }

还有一种解法,这个看看就好哈哈

代码语言:javascript
复制
public String replaceSpace(String s) {
       return s.replace(" ","%20");
}

参考链接:

  1. https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/mian-shi-ti-05-ti-huan-kong-ge-ji-jian-qing-xi-tu-/
  2. https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/mian-shi-ti-05-ti-huan-kong-ge-by-leetcode-solutio/

革命尚未成功,同志仍需努力,冲冲冲

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千羽的编程时光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 剑指 Offer 面试题4. 替换空格
  • 方法一:遍历添加
  • 方法二:字符数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档