在C++中查找字符是否为元音还是辅音
给定一个字符,请检查它是元音还是辅音。元音是’a’,’e’,’i’,’o’和’u’。所有其他字符(’b’,’c’,’d’,’f’ …..)都是辅音。
例子:
**输入** : x = 'c'
**输出** : 辅音
**输入** : x = 'u'
**输出** : 元音
{IDE}
我们检查给定的字符是否与5个元音中的任何一个匹配。如果是,则打印“元音”,否则打印“辅音”。
// C++程序检查给定的字符是否为元音或辅音。
#include <iostream>
using namespace std;
//检查字符是元音还是辅音的函数
void vowelOrConsonant(char x)
{
if (x == 'a' || x == 'e' ||
x == 'i' || x == 'o' ||
x == 'u')
cout << "元音" << endl;
else
cout << "辅音" << endl
}
//主函数
int main()
{
vowelOrConsonant('c');
vowelOrConsonant('e');
return 0;
}
输出:
辅音
元音
时间复杂度: O(1)
辅助空间: O(1)
如何处理大写字母?
// C++程序检查给定的字符是否为元音或辅音。
#include <iostream>
using namespace std;
//检查字符是元音还是辅音的函数
void vowelOrConsonant(char x)
{
if (x == 'a' || x == 'e' ||
x == 'i' || x == 'o' ||
x == 'u' || x == 'A' ||
x == 'E' || x == 'I' ||
x == 'O' || x == 'U')
cout << "元音" << endl;
else
cout << "辅音" << endl;
}
//主函数
int main()
{
vowelOrConsonant('c');
vowelOrConsonant('E');
return 0;
}
输出:
辅音
元音
时间复杂度: O(1)
辅助空间: O(1)
使用switch case
// C++程序实现上述方法
#include <iostream>
using namespace std;
int isVowel(char ch)
{
int check = 0;
switch (ch)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
check = 1;
}
return check;
}
//主函数
int main()
{
// 1表示元音
cout << "a is " << isVowel('a') << endl;
// 0表示辅音
cout << "x is " << isVowel('x') << endl;
return 0;
}
输出:
a is 1
x is 0
时间复杂度: O(1)
辅助空间: O(1)
另一种方法是在只包含元音的字符串中使用find()函数查找字符。
// C++实现
// 上述方法
#include<iostream>
#include<string>
using namespace std;
int isVowel(char ch)
{
// 母音列表
string str = "aeiouAEIOU";
return (str.find(ch) != string::npos);
}
// 驱动程序
int main()
{
cout<<"a is"<<
isVowel('a') << endl;
cout << "x is " <<
isVowel('x') << endl;
return 0;
}
输出
a is 1
x is 0
时间复杂度: 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 |
// C++程序以实现
// 上述方法
#include<iostream>
using namespace std;
int isVowel(char ch)
{
// 与 (2130466 >>
// (ch & 31)) & 1; 相同
return (0x208222 >>
(ch & 0x1f)) & 1;
}
// 驱动程序
int main()
{
cout<<"a is"<<
isVowel('a') << endl;
cout << "x is " <<
isVowel('x') << endl;
return 0;
}
输出
a is 1
x is 0
时间复杂度: O(1)
辅助空间: O(1)
* 在 X86 机器上可以省略 ( ch & 0x1f ) 部分,因为 SHR/SAR(即 >>)的结果会自动掩码为 0x1f。
- 对于机器来说,位图检查比表格检查更快,但如果 ch 变量存储在寄存器中,则可能执行得更快。