lintcode-212-空格替换

看到18%通过率的简单题,发现事情没那么简单。

lintcode-212-空格替换_第1张图片
18%? interesting

题目

描述:
设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。
你的程序还需要返回被替换后的字符串的长度。
注意事项:
如果使用 Java 或 Python, 程序中请用字符数组表示字符串。

样例:
对于字符串"Mr John Smith", 长度为 13
替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17 作为结果返回。

总结

踩到的坑

  • 以为是简单的字符串替换
  • %20就是用来表示空格的,参见这里
  • 只返回新字符串的长度,并检查原字符串
  • 字符串以列表的形式给出,并不能使用split
  • 不清楚检查机制,但经过多次试错发现应该是以id(string)来检查原来的字符串string的,所以不能生成新的字符串再赋值
  • 注意特殊值

思路

  • 既然给出列表,则使用 append() 和 pop() 保证原地操作
  • 传入的原长度 length 用于检测
  • pop() 默认参数为 -1 即从队尾出列,可使用 pop(0) 从队头出列
  • 为保证长度正确以及避免编译器不认,分三次append

代码

class Solution:
    # @param {char[]} string: An array of Char
    # @param {int} length: The true length of the string
    # @return {int} The true length of new string
    def replaceBlank(self, string, length):
        # Write your code here
        if string is None:
            return 0
        count = length
        for s in string:
            if count != 0:
                count -= 1
                if s != ' ':
                    string.append(s)
                else:
                    string.append('%')
                    string.append('2')
                    string.append('0')
        for i in range(length):
            string.pop(0)
        return len(string)

你可能感兴趣的:(lintcode-212-空格替换)