剑指Offer | 从替换空格看字符串格式转换技巧
2023-12-21 13:43:32
字符串格式转换:掌握替换空格的精髓
探索字符串格式转换的奥秘
在软件开发中,字符串处理无处不在,而字符串格式转换则是其中至关重要的环节。它涉及各种编码、解码和格式化操作,在实际应用中扮演着不可或缺的角色。本文将以经典的剑指 Offer 问题「替换空格」为例,深入解析字符串格式转换技巧,让你轻松应对编程面试中的此类难题。
走进「替换空格」的解题世界
「替换空格」问题要求我们将字符串中的每个空格替换为「%20」。乍一看,这似乎是一个简单的替换操作,但细究之下却暗藏着字符串格式转换的精髓。
从后向前:巧妙解决覆盖难题
为了避免字符覆盖问题,我们采用从后向前替换的巧妙策略。从字符串的最后一个字符开始,逐个字符向左遍历,遇到空格时,直接用「%20」替换,既简单又高效。
代码实现:逐行剖析
public class ReplaceSpace {
public String replaceSpace(String str) {
// 计算扩容后的字符数组长度
int newLength = str.length() + (str.length() - str.replace(" ", "").length()) * 2;
// 创建扩容后的字符数组
char[] newCharArr = new char[newLength];
// 从后向前替换
int index = newLength - 1;
for (int i = str.length() - 1; i >= 0; i--) {
if (str.charAt(i) == ' ') {
newCharArr[index--] = '0';
newCharArr[index--] = '2';
newCharArr[index--] = '%';
} else {
newCharArr[index--] = str.charAt(i);
}
}
// 将扩容后的字符数组转换为字符串
return new String(newCharArr);
}
}
复杂度分析:条分缕析
- 时间复杂度:O(n),其中 n 是原字符串的长度。逐个字符遍历,复杂度与字符串长度线性相关。
- 空间复杂度:O(n),其中 n 是扩容后的字符数组长度。需要新建一个字符数组,其长度与扩容后的字符串长度相等。
结语:掌握字符串格式转换技巧
通过剑指 Offer 中的「替换空格」问题,我们不仅掌握了从后向前替换的方法,还深入理解了字符串格式转换的精髓。这些技巧对于解决编程面试中的字符串操作问题非常有用,同时在实际开发中也具有广泛的应用场景。
常见问题解答
1. 为什么需要扩容字符数组?
因为替换后的字符串长度可能会大于原字符串的长度(空格替换成「%20」后长度增加),所以需要提前计算扩容后的长度。
2. 为什么从后向前替换?
从后向前替换可以避免字符覆盖问题,当遇到空格时,可以直接替换,无需担心覆盖后面的字符。
3. 除了「替换空格」,还有哪些常见的字符串格式转换操作?
还有编码/解码(如 Base64、URL 编码)、格式化(如日期格式化、数字格式化)等。
4. 在实际开发中,字符串格式转换有哪些应用场景?
广泛应用于 Web 开发、数据处理、文本分析等领域,比如 URL 编码、JSON 解析、日志格式化等。
5. 如何提高字符串格式转换的效率?
可以使用预编译正则表达式、高效的数据结构(如哈希表)和并行处理等技术来优化效率。