我正在研究Rust中的一些编码挑战,其中一个问题是确定一个短语是否是一个pangram。我见过以下实现:
// Copy chars into a vector, sort and remove duplicates
let mut chars: Vec<char> = pangram.chars().collect();
chars.sort();
chars.dedup();
然而,由于排序,此解决方案的时间为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;
}
我收到以下错误:
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帮助:首先通过原始指针投射
pangram.rs:14:24:14:34错误:施放
&u8
为usize
无效pangram.rs:14 if!see [122 - c as usize] { pangram.rs:14:24:14:34帮助:首先通过原始指针投射
pangram.rs:15:24:15:34错误:施放
pangram.rs:15见[122 - c as usize] = true;&u8
为usize
无效pangram.rs:15:24:15:34帮助:先通过原始指针投射
错误:由于之前的3个错误导致中止
我尝试过投放c as *mut usize
和c as *const usize
,但都没有效果。我做了多少这个工作?
答案 0 :(得分:5)
这是一个非常简单的改变 - 实际上是一个角色:
MissingOverride
您正在尝试将引用(这是 for &c in s.to_lowercase().as_bytes() {
^
导致的结果)视为常规值,但这不起作用。
您可以执行上面的操作(将as_bytes
更改为for c in
)或将for &c in
循环内的所有c
替换为for
;他们基本上做同样的事情。