面试题答案
一键面试- 优化思路:
- 为了减少内存分配和不必要的拷贝,可以使用
std::str::split
方法,它返回一个迭代器,不会立即分配新的内存来存储分割后的字符串。split
方法会根据给定的分隔符分割字符串,并返回子字符串的引用。 - 关于编码问题,Rust中的
String
和str
类型默认使用UTF - 8编码。如果原始字符串是有效的UTF - 8编码,那么split
方法返回的子字符串引用也是有效的UTF - 8编码。在处理过程中不需要额外的编码转换操作,除非有特殊的编码需求。
- 为了减少内存分配和不必要的拷贝,可以使用
- 代码实现:
fn split_string(s: &str) -> Vec<String> {
s.split('#')
.map(|sub| sub.to_string())
.collect()
}
在这段代码中:
s.split('#')
使用#
作为分隔符对字符串s
进行分割,返回一个迭代器,迭代器中的每个元素是分割后的子字符串的引用(类型为&str
)。.map(|sub| sub.to_string())
将每个子字符串的引用转换为拥有所有权的String
。这一步虽然有一次拷贝操作,但由于我们需要将结果存储在Vec<String>
中,所以这是必要的。如果不需要拥有所有权,直接返回Vec<&str>
,则可以省略这一步。.collect()
将迭代器中的所有元素收集到Vec<String>
中。
如果不想进行to_string
的拷贝操作,代码可以修改为返回Vec<&str>
:
fn split_string(s: &str) -> Vec<&str> {
s.split('#')
.collect()
}
这种情况下,调用者需要注意Vec<&str>
中的字符串引用的生命周期依赖于原始字符串s
的生命周期。如果原始字符串s
被释放,Vec<&str>
中的引用将指向无效内存。