URLify a Given String (Replace spaces with %20) in Java

2025年3月31日 | 阅读 5 分钟

"URLify" 描述了用 %20 替换字符串中每个空格的做法,%20 通常用于表示 URL 中的空格。在构建可能包含空格的字符串以供 URL 使用时,这一点至关重要,因为实际空格在 URL 中是不允许的。

什么是 URLify?

"URLify" 是用 %20 替换字符串中的空格的过程。例如,给定字符串 "Hello World",其 URLify 版本将是 "Hello%20World"。由于 URL 不能包含空格,因此 %20 用作编码,以保持功能性和可读性,这需要进行此类修改。

我们为什么需要 URLify 字符串?

在创建在线应用程序时,包含空格的字符串(如文件位置、用户名或文本片段)必须转换为 URL 友好格式。如果未将空格替换为 %20,URL 将无效,并且可能无法正常工作。因此,URLify 确保字符串符合 URL 编码要求。

手动方法:理解字符串操作

为了理解如何在 Java 中 URLify 字符串,让我们从一种简单的手动方法开始。假设您有一个字符串 "Java Programming Language"。

涉及的步骤是:

  1. 遍历字符串并定位所有空格。
  2. 遇到的每个空格都替换为 %20。
  3. 用这些修改构建新字符串。

示例

输入:"Java Programming Language"

输出: "Java%20Programming%20Language"

Java 中 URLify 的解决方案

让我们深入研究两种不同的 Java 中 URLify 字符串的方法。

方法 1:使用 replace() 方法

Java 的 String 类包含一个 replace() 函数,可用于将所有空格 (" ") 实例替换为 %20。此方法简单易懂,但由于 Java 中字符串的处理方式,对于较长的字符串可能不是最高效的。

文件名:URLify.java

输出

 
URLified String: Java%20Programming%20Language   

解释

  • 将一个字符串传入 urlifyString 函数,该函数输出一个所有空格都替换为 %20 的新字符串。
  • 使用 replace(" ", "%20") 方法定位并替换字符串。
  • main 方法使用示例输入测试函数并输出结果。

此方法有效,但由于 Java 将字符串视为不可变对象,因此它不一定是最高效的选择。每次替换都会创建一个新字符串,对于包含许多空格的长字符串来说,这可能很浪费。

方法 2:使用自定义函数

为了优化过程,尤其是在字符串很大时,我们可以使用字符数组实现自定义函数。此方法更接近 C底层语言 的字符串处理方式,并避免了创建多个字符串对象的开销。

文件名:URLify.java

输出

 
URLified String: Java%20Programming%20Language   

解释

  1. 函数 urlifyString()
    • 将输入字符串转换为字符 数组,以便高效地操作单个字符。
    • 它根据字符串的实际长度(trueLength,表示包含有意义字符的字符串部分)中的空格数来计算数组所需的尺寸。
    • 然后,它遍历原始字符串,将空格替换为 %20,并将其他字符直接复制到新数组中。
  2. 函数 countSpaces()
    • 此辅助函数计算原始字符串中直到 trueLength 的空格数。
    • 这有助于确定新字符数组需要多少空间。
  3. main 方法()
    • 演示了 urlifyString 方法与包含额外空格的示例字符串的用法。
    • 传递 trueLength 以确保仅考虑字符串的有意义部分。

性能考虑

与 replace() 技术相比,第二种方法在时间和空间复杂度方面更有效。

  • 时间复杂度: (O(n)),其中 (n) 是字符串的长度。该算法仅扫描字符串一次以计算空格,然后再次扫描以构建新字符串。
  • 空间复杂度: (O(n)),因为使用了一个新的字符数组,其大小与原始字符串的大小成正比。

优化解决方案

在时间和空间复杂度方面,第二种选择优于 replace() 方法。

  • 时间复杂度:时间复杂度表示为 O(n),其中 n 是字符串的长度。该算法仅扫描字符串一次以计算空格,然后再次扫描以创建新字符串。
  • 简化空格计数:可以在单次传递中完成空格计数和数组调整大小,以减少开销。

带解释的代码实现

以下是使用字符数组方法实现 URLify 函数的完整 Java 代码

文件名:URLify.java

输出

 
URLified String: Java%20Programming%20Language   

此实现可确保字符串得到高效的 URLify,即使在处理大型输入或不同长度时也是如此。

结论

URLify 字符串是 Java 中的常见任务,所提出的方法提供了不同级别的效率。replace() 方法简单,但由于 Java 中的不可变性,对于较大的字符串来说效率不高。使用字符数组的自定义函数提供了更优化的解决方案。


下一个主题Flutter vs Java