我正在研究Rust中的一些编码挑战,其中一个问题是确定一个短语是否是一个pangram.我见过以下实现:
// Copy chars into a vector, sort and remove duplicates
let mut chars: Vec<char> = pangram.chars().collect();
chars.sort();
chars.dedup();
Run Code Online (Sandbox Code Playgroud)
然而,这种解决方案是O(nlogn)时间因为排序.我可以及时做到O(n),但我遇到了问题.
下面是我试过写的代码:
fn is_pangram(s: String) -> bool {
let mut num_seen = 0;
let mut seen: [bool; 26] = [false; 26];
for c in s.to_lowercase().as_bytes() {
// ASCII 10 is newline character
if c as usize == 10 {
break;
}
// Lowercase ASCII is 97 to 122
if !seen[122 - c as usize] {
seen[122 - c as usize] = true;
num_seen += 1;
}
}
return num_seen == 26;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
18:55 $ rustc pangram.rs
pangram.rs:10:12:10:22错误:铸造
&u8为usize无效pangram.rs:10如果c as usize == 10 {pangram.rs:10:12:10:22 help:首先通过原始指针
pangram.rs:14:24:14:34错误:铸造
&u8为usize无效pangram.rs:14 if!see [122 - c as usize] {pangram.rs:14:24:14:34 help:首先通过原始指针
pangram.rs:15:24:15:34错误:转换
&u8为usize无效pangram.rs:15见[122 - c as usize] = true;
pangram.rs:15:24:15:34帮助:首先通过原始指针
错误:由于之前的3个错误导致中止
我试过铸造c as *mut usize和c as *const usize,但既不工作.我做了多少这个工作?
这是一个非常简单的变化 - 一个单一的角色,事实上:
for &c in s.to_lowercase().as_bytes() {
^
Run Code Online (Sandbox Code Playgroud)
您试图将引用(这是as_bytes导致的结果)视为常规值,但这不起作用.
您可以执行上面所做的操作(更改for c in为for &c in)或替换循环c内部的所有实例; 他们基本上做同样的事情.for*c