Uniform Resource Identifiers (or URIs) are strings like http://icpc.baylor.edu/icpc/, mailto:foo@bar.org, ftp://127.0.0.1/pub/linux, or even just readme.txt that are used to identify a resource, usually on the Internet or a local computer. Certain characters are reserved within URIs, and if a reserved character is part of an identifier then it must be percent-encoded by replacing it with a percent sign followed by two hexadecimal digits representing the ASCII code of the character. A table of seven reserved characters and their encodings is shown below. Your job is to write a program that can percent-encode a string of characters. ### 北大ACM题目之3650:字符替换 #### 问题描述 本题主要涉及Uniform Resource Identifiers(URI)中的字符替换问题。在URI中,有一些特殊字符是被保留使用的,如果这些保留字符出现在标识符中,则必须通过百分号编码(percent-encoding)的方式进行转义处理。具体的,就是将保留字符替换为一个百分号(%)后面跟着该字符ASCII码的两位十六进制表示形式。 #### 预定义保留字符及其编码 在本题中,需要关注的保留字符及其编码如下表所示: | 原始字符 | 编码形式 | |---------|---------| | `!` | `%21` | | `$` | `%24` | | `%` | `%25` | | `(` | `%28` | | `)` | `%29` | | `*` | `%2a` | | 空格 | `%20` | #### 代码分析与解析 ##### 主要类结构 代码使用Java编写,包含了一个名为`PercentSolution3650`的公共类。这个类中定义了一个主方法`main`,用于处理输入字符串,并根据上述规则进行字符替换。 ##### 输入处理 1. **输入流初始化**:代码使用`BufferedReader`类读取标准输入流(`System.in`),以逐字符读取输入。 2. **字符存储**:使用`StringBuilder`类创建一个可变字符串`sb`,用于存储输入的字符。 3. **循环读取**:程序持续读取输入流中的字符,直到遇到字符`#`为止。在此过程中,如果读取到空字符(即换行符),则标记变量`num`为1,用于后续处理。 4. **列表存储**:创建一个`ArrayList<String>`类型的列表`list`,并将`sb`中非`#`字符逐个添加至该列表中。 ##### 字符替换逻辑 1. **异常字符过滤**:对于列表`list`中的元素,如果首尾存在空字符或者连续出现空字符,则清除整个列表,并设置`num`为1。 2. **替换处理**:若`num`仍为0,表示输入字符串格式正确,则遍历列表`list`中的每个字符,按照预定义的替换规则进行替换操作。 3. **输出结果**:最终,将处理后的字符重新组合成字符串,并输出结果。 #### Java代码实现要点 1. **输入输出流管理**:通过`BufferedReader`和`InputStreamReader`的结合使用,可以高效地处理文本输入。 2. **字符串构建**:利用`StringBuilder`可以更灵活地构建和修改字符串。 3. **数据结构选择**:这里使用了`ArrayList<String>`来存储字符,便于后续处理。 4. **条件判断与流程控制**:合理的条件判断和循环结构有助于实现复杂的逻辑处理。 5. **编码转换**:了解字符与其对应的编码形式,能够准确地完成替换任务。 #### 总结 通过对本题目的解析,我们不仅学习了URI中字符替换的基本概念,还深入了解了如何使用Java语言实现相应的功能。此外,通过实际编程练习,还可以进一步提升解决实际问题的能力。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class PercentSolution3650 {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int temp, num = 0;
List<String> list = new ArrayList<String>();
try {
while ((temp = br.read()) != -1) {
if(String.valueOf(temp)==" ")
num=1;
sb.append((char) temp);
if (temp == '#') {
break;
}
}
for (int j = 0; j < sb.length(); j++) {
if (sb.toString().charAt(j) != '#')
list.add(j, String.valueOf(sb.toString().charAt(j)));
}
sb.delete(0, sb.length());
br.close();
} catch (IOException e) {
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip