#P14220. 拼接url(100分)
-
1000ms
Tried: 30
Accepted: 17
Difficulty: 3
所属公司 :
华为od
-
算法标签>模拟
拼接url(100分)
题目描述
给定一个url 前缀 和 一个url 后缀,通过“,”分割,需要将其连接为一个完整的 url:
- 如果前缀结尾和后缀开头都没有
/,需要自动补上/连接符; - 如果前缀结尾和后缀开头都为
/,需要自动去重; - 约束:不用考虑前后缀URL 不合法情况。
思路
-
读入原始字符串,并以
,分割成两部分,分别记作 a(前缀)和 b(后缀)。 -
分别判断:
- a 的末尾是否为
/; - b 的开头是否为
/。
- a 的末尾是否为
-
根据四种情况进行拼接:
-
若 a 和 b 都为空:输出
/。 -
若 a 为空:在输出时保证以
/开头,不重复/。 -
若 b 为空:在输出时保证以
/结尾,不重复/。 -
否则:
- 若 a 末尾和 b 开头都为
/,则去掉重叠的一个; - 若 均不为
/,则补上一个; - 其余则直接拼接。
- 若 a 末尾和 b 开头都为
-
六种情况可以归纳为:

C++
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
// 读取整行输入
getline(cin, s);
// 分割逗号,得到前缀 a 和后缀 b
size_t p = s.find(',');
string a = s.substr(0, p);
string b = (p == string::npos ? "" : s.substr(p + 1));
// 判断 a 末尾和 b 开头是否为 '/'
bool a_slash = (!a.empty() && a.back() == '/');
bool b_slash = (!b.empty() && b.front() == '/');
string r;
if (a.empty() && b.empty()) {
// 前后都空,输出 "/"
r = "/";
}
else if (a.empty()) {
// 仅前缀空,保证以 "/" 开头且不重复
r = "/" + (b_slash ? b.substr(1) : b);
}
else if (b.empty()) {
// 仅后缀空,保证以 "/" 结尾且不重复
r = a + (a_slash ? "" : "/");
}
else if (a_slash && b_slash) {
// 重叠双斜杠,去重
r = a + b.substr(1);
}
else if (!a_slash && !b_slash) {
// 都缺斜杠,补上
r = a + "/" + b;
}
else {
// 其余情况,直接拼接
r = a + b;
}
// 输出结果
cout << r;
return 0;
}
Python
# 读取输入并分割成前缀 a 和后缀 b
s = input().strip()
parts = s.split(',', 1)
a = parts[0]
b = parts[1] if len(parts) > 1 else ''
# 判断 a 末尾和 b 开头是否为 '/'
a_slash = bool(a) and a[-1] == '/'
b_slash = bool(b) and b[0] == '/'
# 拼接逻辑
if not a and not b:
# 前后都空,输出 "/"
r = '/'
elif not a:
# 前缀空,保证以 "/" 开头且不重复
r = '/' + (b[1:] if b_slash else b)
elif not b:
# 后缀空,保证以 "/" 结尾且不重复
r = a + ('/' if not a_slash else '')
elif a_slash and b_slash:
# 去重双斜杠
r = a + b[1:]
elif not a_slash and not b_slash:
# 补斜杠
r = a + '/' + b
else:
# 直接拼接
r = a + b
print(r)
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取整行输入
String s = sc.nextLine();
String[] parts = s.split(",", 2);
String a = parts[0];
String b = parts.length > 1 ? parts[1] : "";
sc.close();
// 判断 a 末尾和 b 开头是否为 '/'
boolean aSlash = !a.isEmpty() && a.charAt(a.length() - 1) == '/';
boolean bSlash = !b.isEmpty() && b.charAt(0) == '/';
String r;
if (a.isEmpty() && b.isEmpty()) {
// 前后都空,输出 "/"
r = "/";
} else if (a.isEmpty()) {
// 前缀空,保证以 "/" 开头且不重复
r = "/" + (bSlash ? b.substring(1) : b);
} else if (b.isEmpty()) {
// 后缀空,保证以 "/" 结尾且不重复
r = a + (aSlash ? "" : "/");
} else if (aSlash && bSlash) {
// 去重双斜杠
r = a + b.substring(1);
} else if (!aSlash && !bSlash) {
// 补斜杠
r = a + "/" + b;
} else {
// 直接拼接
r = a + b;
}
// 输出结果
System.out.print(r);
}
}
题目描述
给定一个 url 前缀和 url 后缀,通过,分割 需要将其连接为一个完整的 url 如果前缀结尾和后缀开头都没有 /,需要自动补上 / 连接符 如果前缀结尾和后缀开头都为 /,需要自动去重 约束: 不用考虑前后缀 URL 不合法情况。
输入描述
url 前缀(一个长度小于 100 的字符串),url 后缀/(一个长度小于100的字符串)
输出描述
拼接后的url
样例1
输入
acm,/bb
输出
acm/bb
样例2
输入
/abc,/bcd
输出
/abc/bcd
样例3
输入
/acd,bef
输出
/acd/bef
样例4
输入
,
输出
/