Fork me on GitHub
0%

URL字符串解码

题目描述

在URL字符串中,如果百分号%后面跟了两个十六进制数字,那么它表示相应ASCII值所对应的字符,如%2F表示'/'%32表示'2'。%编码还可以进行嵌套,如%%32F可以解码成%2F,再进一步解码成/。如果没有任何百分号后面跟的是两个十六进制数字则无法再进行解码。

现在有一系列的URL,希望你帮忙进行百分号解码,直到无法再解码为止。

输入描述

第一行一个正整数T(T<=10),表示T个测试样例;
对于每个测试样例,输入字符串s,字符串不包含空白符且长度小于100,000。
有部分测试样例的字符串长度<=1,000.

输出描述

输出T行,每行一个字符串,表示解码后的结果。

示例1
输入

1
2
1
%%32F

输出

1
/

C++解决方案

我这里写了一个C++的URL解码方案,主要思路是借用了一个栈,从字符串后边开始遍历,如果不是%则放入栈中,遇到%则从栈顶取出两个字符,将这个十六进制的字符串转换成ASCII码后又放入栈顶。继续遍历,直到输入字符串的头部,最后将栈中字符输出即为所得字符串。

URL_Decode.cpplink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
#include <stack>
#include <string>
// #include <cstdlib>

using namespace std;

string hex2ascii(string hex)
{
int len = hex.length();
std::string newString;
for (int i = 0; i < len; i += 2)
{
string byte = hex.substr(i, 2);
char chr = (char)(int)strtol(byte.c_str(), NULL, 16);
newString.push_back(chr);
}
return newString;
}

std::string urlDecode(std::string &eString)
{
stack<char> s;
string newstr;
for (int i = eString.size() - 1; i >= 0; i--)
{
char tmp = eString[i];
if (tmp == '%')
{

newstr.push_back(s.top());
s.pop();
newstr.push_back(s.top());
s.pop();

newstr = hex2ascii(newstr);
s.push(newstr[0]);
newstr.clear();
}
else
{
s.push(tmp);
}
}
while (!s.empty())
{
newstr.push_back(s.top());
s.pop();
}
return newstr;
}

vector<string> url_decode(vector<string> strs)
{
vector<string> res;
for (int i = 0; i < strs.size(); i++)
{
string str1 = strs[i];
string str2 = urlDecode(str1);
res.push_back(str2);
}
return res;
}

int main(int argc, char const *argv[])
{
int T;
cin >> T;
vector<string> test;
for (int i = 0; i < T; i++)
{
string str;
cin >> str;
test.push_back(str);
}
vector<string> res = url_decode(test);
for (int i = 0; i < res.size(); i++)
{
cout << res[i] << endl;
}

return 0;
}

其中string hex2ascii(string hex)为十六进制的字符串转换成ASCII码的方法,两个十六进制的字符对应一个ASCII码。其中使用了C 库函数 - strtol(),C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间表示多少进制,或者是特殊值 0。

试了好几个例子都没问题,但是在牛客网上提交却是0%通过,很奇怪,还希望有缘人看到这个后能指出错误。

Link
Send
Send
Pin
打赏一次,年薪百万.