Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小问题:字符串与位置。
提问
给定一个字符串 S,将每个字母替换为其在字母表中的位置。如果文本中的任何内容不是字母,请忽略它并且不要返回它。
例:
input:"The sunset sets at twelve o' clock." ouput:"20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"
该例子中,'、.和 均不是字母,所以不在输出序列中。
模板:
fn alphabet_position(text: &str) -> String {}
分析
字母在字母表中的位置,都可以表示为该字母减去对应的大小写形式A或者a再加一(位置从1开始计数)。所以我们得思路是,遍历该字符串的字符,如果字符大小在字母的区间内,说明是字母,那么就是减去对应的大小写a。以此类推。
解决方案
fn alphabet_position(text: &str) -> String {
let mut nums_vec = Vec::new();
for x in text.chars() {
let code = x as u8;
if code >= 97 && code <= 122 {
nums_vec.push(format!("{}", code - 96));
}
if (code >= 65 && code <= 90) {
nums_vec.push(format!("{}", code - 64));
}
}
nums_vec.join(" ")
}
Trick
char类型转换成ascii形式的数字,直接使用as u8,但是注意,该方法其实并不严谨,因为在rust中,一个char的大小是不固定的,此处只是为了方便而已。正确情况下应该先判断char的大小范围。- 将
Vec转换成字符串,使用join方法。