【九章斩题录】Leetcode:面试题 01.03. URL化(C/C++)

     精品题解  《九章斩题录》   猛戳订阅


面试题 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 
#include 
#include  // 用于判断字符的函数

// 函数将字符编码为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(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.

你可能感兴趣的:(九章斩题录,c语言)