剑指offer05(Java)-替换空格(简单)

Posted 我不想一直当菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer05(Java)-替换空格(简单)相关的知识,希望对你有一定的参考价值。

题目:

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

 

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."
 

限制:

  • 0 <= s 的长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考题解:代码随想录

方法一:使用一个新的对象StringBuffer,复制 s,复制的过程对其判断,是空格则替换,否则直接复制。

Java StringBuffer toString() 方法返回此字符序列的字符串表示形式。StringBuffer 类的一个对象表示一个字符序列。toString() 方法将此序列转换为字符串。

 class Solution 
     public String replaceSpace(String s) 
         //特判
         if (s == null || s.length() == 0) return s;
         StringBuffer sb = new StringBuffer();
         for (int i = 0; i < s.length(); i++)
             if (s.charAt(i) == \' \')
                 sb.append("%20");
             else
                 sb.append(s.charAt(i));
             
         
         return sb.toString();
     
 

方法二:双指针

需要将空格替换为 "%20" ,字符串的总字符数增加,因此需要扩展原字符串 s 的长度,计算公式为:新字符串长度 = 原字符串长度 + 2 * 空格个数。图片来源:K神老师

 思路:

  • 初始化:字符串 s 的长度 len,进行判空 ;
  • 增加长度:定义一个可变字符序列StringBuffer,如果遇到原字符串中的一个空格,就将StringBuffer添加两个空格,遍历完后,如StringBuffer中没有空格,则直接返回s,否则将空格数添加至原字符后面。
  • 倒序遍历修改:将原字符串变为字符串数组,i 指向原字符串尾部元素len -1, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历);
    • 当 s[i] 不为空格时:执行 s[j] = s[i] , j--;
    • 当 s[i] 为空格时:挨个添加字符-- "%20" ;
    • 上两步都判断后执行:i--;
  • 返回值:修改后的字符串数组转为字符串返回 ;
 class Solution 
     public String replaceSpace(String s) 
         //特判
         int len = s.length();
         if (len == 0 || s == null) return s;
         //统计空格数量,并扩充2倍
         StringBuffer sb = new StringBuffer();
         for (int i = 0; i < len; i++)
             if (s.charAt(i) == \' \') sb.append("  ");
         
         //如果sb没有空格
         if (sb.length() == 0) return s;
         //将空格加到原字符后面
         s += sb.toString();
         //将字符串转为字符数组
         char[] str = s.toCharArray();
         //i指向原字符串末尾,j指向新字符串末尾
         int i = len - 1, j = str.length - 1;
         while (i != j)
             if (str[i] != \' \')
                 str[j] = str[i];
                 j--;
             else
                 str[j--] = \'0\';
                 str[j--] = \'2\';
                 str[j--] = \'%\';
             
             i--;
         
         return new String(str);
     
 

注意:两个地方

 ①为什么i--要写在后面而不是写在j--后面?

 这时“%20”已经添加完毕,i没变仍为空格,j位置又会开始加“%20”,i就一直不动,导致违背题意(可以自己在草稿纸上推一下),故i--需要写在后面,保证i一直在往前移动。

②为什么最后一个j也要减减?

j--:表示先使用后减。最后一个j使用后再减1,是为了跳到下一个位置,后续可以放其他字符。

小知识:

StringBuilder类 和 StringBuffer类:

  • StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储

  • StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储

LeetCode(剑指 Offer)- 05. 替换空格

题目链接:点击打开链接

题目大意:略。

解题思路:略。

相关企业

  • 小米集团

AC 代码

  • Java
// 解决方案(1)
class Solution 
    public String replaceSpace(String s) 
        return s.replace(" ", "%20");
    


// 解决方案(2)
class Solution 
    public 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();
    
  • C++ 
class Solution 
public:
    string replaceSpace(string s) 
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) 
            if (c == ' ') count++;
        
        // 修改 s 长度
        s.resize(len + 2 * count);
        // 倒序遍历修改
        for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) 
            if (s[i] != ' ')
                s[j] = s[i];
            else 
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            
        
        return s;
    
;

以上是关于剑指offer05(Java)-替换空格(简单)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer05 替换空格

LeetCode(剑指 Offer)- 05. 替换空格

LeetCode刷题剑指Offer05-简单-替换空格

Leetcode剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格

LeetCode:剑指Offer 05. 替换空格 (字符串)