[炼手Rust]字符串与位置

98 阅读1分钟

Hi,大家好,这里是炼手Rust专栏,我是xiaoK,今天来看一个小问题:字符串与位置。

maxresdefault.jpg

提问

给定一个字符串 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

  1. char类型转换成ascii形式的数字,直接使用as u8,但是注意,该方法其实并不严谨,因为在rust中,一个char的大小是不固定的,此处只是为了方便而已。正确情况下应该先判断char的大小范围。
  2. Vec转换成字符串,使用join方法。