面试题答案
一键面试优化思路
- 减少内存分配:频繁的内存分配和释放会消耗大量时间。在替换操作中,可以尝试一次性分配足够的内存来存储替换后的字符串,避免在过程中多次动态分配内存。
- 使用高效算法:对于查找子串,Rust的
str
类型本身提供了高效的查找方法。可以利用这些方法直接在原字符串上进行操作,而不是每次查找都创建新的字符串片段。 - 预计算:如果可能,提前计算好一些值,比如特定子串的长度、出现次数等,有助于减少运行时的计算量。
具体实现代码
fn replace_substring_efficiently(long_string: &str, target: &str, replacement: &str) -> String {
let mut result = String::with_capacity(long_string.len());
let mut last_index = 0;
for (index, part) in long_string.split(target).enumerate() {
result.push_str(part);
if index < long_string.split(target).count() - 1 {
result.push_str(replacement);
}
last_index += part.len();
if index < long_string.split(target).count() - 1 {
last_index += target.len();
}
}
result
}
你可以这样调用这个函数:
fn main() {
let long_string = "a very long string with a lot of repeated substrings like abcabcabc";
let target = "abc";
let replacement = "xyz";
let result = replace_substring_efficiently(long_string, target, replacement);
println!("{}", result);
}
在上述代码中:
replace_substring_efficiently
函数接收原长字符串、目标子串和替换子串作为参数。- 使用
String::with_capacity
预先分配足够的空间,减少内存重新分配的次数。 - 通过
split
方法分割原字符串,每次分割后将部分和替换子串按顺序加入到结果字符串中,从而高效地完成替换操作。