我正在研究Rust中的一些编码挑战,其中一个问题是确定一个短语是否是一个pangram.我见过以下实现:
// Copy chars into a vector, sort and remove duplicates let mut chars: Vec= 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 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() { ^
您试图将引用(这是as_bytes
导致的结果)视为常规值,但这不起作用.
您可以执行上面所做的操作(更改for c in
为for &c in
)或替换循环c
内部的所有实例; 他们基本上做同样的事情.for
*c