面试题答案
一键面试- 思路:
- UTF - 8编码特性:UTF - 8是一种变长编码,一个中文字符通常占用3个字节。在遍历和截取时,需要确保操作是基于完整的字符边界,否则可能导致截断字符,出现乱码。
- Rust字符串性能:Rust的
String
类型内部存储是UTF - 8编码的字节序列。直接对String
按字节操作可能破坏字符完整性,所以要使用合适的方法。
- 具体优化方法及相关API:
- 遍历操作:
- 使用
chars
方法。String
类型提供了chars
方法,它会按字符遍历字符串,而不是按字节。例如:
- 使用
- 遍历操作:
let s = "你好,世界".to_string();
for c in s.chars() {
println!("{}", c);
}
- 截取操作:
- 使用
char_indices
方法获取字符索引。char_indices
方法返回一个迭代器,每个元素是一个包含字符索引和字符本身的元组。例如:
- 使用
let s = "你好,世界".to_string();
let mut indices = s.char_indices().collect::<Vec<_>>();
// 假设要截取前两个字符
let start = indices[0].0;
let end = indices[1].0 + indices[1].1.len();
let sub_str = &s[start..end];
println!("{}", sub_str);
- 如果已知要截取的字符数量,可以使用`graphemes`方法结合`take`方法。`graphemes`方法按字符群(通常是一个字符,但有些复杂字符可能由多个字符群组成)分割字符串,`take`方法用于获取指定数量的字符群。例如:
use std::str::Chars;
let s = "你好,世界".to_string();
let sub_str: String = s.graphemes(true).take(2).collect();
println!("{}", sub_str);
这样能保证在频繁的字符遍历和截取操作中,利用Rust的字符串API正确处理UTF - 8编码的中文字符,同时优化性能。