精品题解 🔥 《九章斩题录》 👈 猛戳订阅
面试题 01.03. URL化
📚 题目:URL化。编写一种方法,将字符串中的空格全部替换为%20
。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java
实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1:
输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith"
示例 2:
输入:" ", 5 输出:"%20%20%20%20%20"
✅ 模板:C++
class Solution {
public:string replaceSpaces(string S, int length) {}
};
💡 思路:重开一个新的数组,然后遍历字符串的每个字符,如果字符是空格就添加 %20 到数组中,不是就直接添加当前字符。最后返回字符串就行,值得注意的是这里要求我们知道字符串真实长度,所以范围就别用 S.size() 了,直接用它提供的 length 形参。
💬 代码演示:
class Solution {
public:string replaceSpaces(string S, int length) {string ans;for (int i = 0; i < length; i++) {if (S[i] == ' ') {ans += "%20";} else {ans += S[i];}}return ans;}
};
什么是 url 化?
URL化,也称为URL编码或百分号编码,是一种将特殊字符和非安全字符转换为URL安全格式的过程。URL化是因为URL(Uniform Resource Locator)中只能包含特定字符集合,如果URL中包含不安全的字符,或者需要传输的数据中包含特殊字符(如空格、标点符号等),就需要对它们进行编码,以确保它们在URL中不引起混淆或错误。
URL化的主要目的
防止URL中的特殊字符干扰URL的解析和传输。
确保URL在各种网络和浏览器环境中都能正确解释和显示。
允许在URL中包含各种字符,包括非ASCII字符,以支持多语言和国际化的URL。
URL化的基本规则
将要编码的字符转换为其ASCII值的十六进制表示,并在前面添加一个百分号 "%"。例如,空格字符(ASCII值为32)会编码为"%20"。
保留一些特殊字符,如字母、数字、连字符、下划线和句点,它们不需要编码。
对于非ASCII字符,通常使用 UTF-8 编码对其进行URL化。
以下是一些常见的URL编码示例:
- 空格编码为 "%20"
- 斜杠 "/" 编码为 "%2F"
- 问号 "?" 编码为 "%3F"
- 等号 "=" 编码为 "%3D"
- 百分号 "%" 编码为 "%25"
💭 代码演示:
#include <iostream>
#include <string>
#include <cctype> // 用于判断字符的函数// 函数将字符编码为URL安全格式
std::string urlEncode(const std::string& input) {std::string encoded;for (char c : input) {if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {// 如果是字母、数字、连字符、下划线、点或波浪线,保留不变encoded += c;} else {// 否则,将字符编码为百分号编码char buffer[4];snprintf(buffer, sizeof(buffer), "%%%02X", static_cast<unsigned char>(c));encoded += buffer;}}return encoded;
}int main() {std::string input = "Hello World! How are you?";std::string encoded = urlEncode(input);std::cout << "Original: " << input << std::endl;std::cout << "Encoded: " << encoded << std::endl;return 0;
}
🚩 运行结果如下:
Original: Hello World! How are you?
Encoded: Hello%20World%21%20How%20are%20you%3F
原始字符串中的空格被编码为 %20
,感叹号被编码为 %21
,问号被编码为 %3F
,这是URL编码的标准结果。其他字符保持不变。
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2023.
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 C++reference[EB/OL]. []. http://www.cplusplus.com/reference/. Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/. 牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=13. |