统计特殊字母的数量Ⅰ。用go语言,给定一个字符串 word,统计其中具有大写和小写形式同时存在的字母的数量。
输入:word = "aaAbcBC"。
输出:3。
解释:
word 中的特殊字母是 'a'、'b' 和 'c'。
大体步骤如下:
1.首先定义了一个 numberOfSpecialChars
函数,该函数接收一个字符串 word
作为参数,并返回特殊字母的数量。
2.在函数中创建了一个名为 mask
的数组,数组包含两个整数元素,初始值为0。这里使用了位操作来记录字母的出现情况。
3.通过循环遍历字符串中的每个字符 c
:
- 将字符
c
右移 5位并与1进行与操作,以确定该字符属于哪个位置的整数(0 或 1)。 - 将字符
c
与31进行与操作,以获取该字符在整数中的具体位置。 - 将相应的位置上的比特位置为1,表示该字符在该整数中出现过。
4.在计算完整个字符串后,将两个整数进行与操作,并统计结果中为1的比特位个数,即为具有大写和小写形式同时存在的字母的数量。
5.最后在 main
函数中定义了一个测试用例 word := "aaAbcBC"
,并调用 numberOfSpecialChars
函数打印出特殊字母的数量。
总的时间复杂度为 O(n),其中 n 为字符串长度,因为需要遍历整个字符串。
总的额外空间复杂度为 O(1),因为只使用了固定大小的数组和常数个变量来存储数据。
Go完整代码如下:
package main
import (
"fmt"
"math/bits"
)
func numberOfSpecialChars(word string) int {
mask := [2]int{}
for _, c := range word {
mask[c>>5&1] |= 1 << (c & 31)
}
return bits.OnesCount(uint(mask[0] & mask[1]))
}
func main() {
word := "aaAbcBC"
fmt.Println(numberOfSpecialChars(word))
}
Rust完整代码如下:
fn number_of_special_chars(word: &str) -> usize {
let mut masks = [0_u32; 2]; // 使用u32存储掩码
for c in word.chars() {
let index = c as usize >> 5 & 1; // 获取高位
masks[index] |= 1 << (c as usize & 31); // 更新掩码
}
// 位与运算计算重叠位的数量
let overlap_mask = masks[0] & masks[1];
// 统计重叠的位数
overlap_mask.count_ones() as usize
}
fn main() {
let word = "aaAbcBC";
println!("{}", number_of_special_chars(word));
}