在C++中查找字符是否为元音还是辅音
给定一个字符,请检查它是元音还是辅音。元音是’a’,’e’,’i’,’o’和’u’。所有其他字符(’b’,’c’,’d’,’f’ …..)都是辅音。
例子:
{IDE}
我们检查给定的字符是否与5个元音中的任何一个匹配。如果是,则打印“元音”,否则打印“辅音”。
输出:
时间复杂度: O(1)
辅助空间: O(1)
如何处理大写字母?
输出:
时间复杂度: O(1)
辅助空间: O(1)
使用switch case
输出:
时间复杂度: O(1)
辅助空间: O(1)
另一种方法是在只包含元音的字符串中使用find()函数查找字符。
输出
时间复杂度: O(1)//因为在 isVowel 函数中,有一个固定长度的字符串。如果我们的字符串长度为 n,则可以说时间复杂度在这里是 O(n),其中 n是常数。
辅助空间: O(1)
使用位移最有效的检查元音字母的方法:
在ASCII码中,每个元音字母(大小写)的值都如下所示。
元音字符 | 十进制 | 十六进制 | 二进制 |
---|---|---|---|
a | 97 | 0x61 | 01100001 |
e | 101 | 0x65 | 01100101 |
i | 105 | 0x69 | 01101001 |
o | 111 | 0x6F | 01101111 |
u | 117 | 0x75 | 01110101 |
A | 65 | 0x41 | 01000001 |
E | 69 | 0x45 | 01000101 |
I | 73 | 0x49 | 01001001 |
O | 79 | 0x4F | 01001111 |
U | 85 | 0x55 | 01010101 |
因为小写和大写的元音字母都有相同的5位最低位,所以我们需要一个数字0x208222,在右移1、5、19、15位后其最低位为1,否则为0 。 数字取决于字符编码。
十进制 | 十六进制 | 二进制 |
---|---|---|
31 | 0x1F | 00011111 |
2130466 | 0x208222 | 1000001000001000100010 |
输出
时间复杂度: O(1)
辅助空间: O(1)
* 在 X86 机器上可以省略 ( ch & 0x1f ) 部分,因为 SHR/SAR(即 >>)的结果会自动掩码为 0x1f。
- 对于机器来说,位图检查比表格检查更快,但如果 ch 变量存储在寄存器中,则可能执行得更快。