到目前为止,我已经想到了这个。我试图最小化字符串操作并将解决方案隔离到内置数据类型、数组和整数操作。
我正在寻找更优雅的方法来检查 pangram 字符串,在 java 中。
优雅,代码行最少,也欢迎使用其他高效算法。
请提供不含 lambda 表达式的建议。
private static boolean isPangrams(String ip) {
char[] characterArray = ip.toLowerCase().toCharArray();
int map[] = new int[26];
int sum = 0;
for(char current : characterArray) {
int asciiCode = (int) current;
if (asciiCode >= 97 && asciiCode <= 122) {
if (map[122 - asciiCode] == 0) {
sum += 1;
map[122 - asciiCode] = 1;
}
}
}
return sum == 26;
}
最佳答案
您可以为此使用位运算:
private static boolean isPangrams(String ip) {
int flags = 0;
for(char current : ip.toLowerCase().toCharArray()) {
if (current >= 'a' && current <= 'z') {
flags |= 0x01<<(current-'a');
}
}
return flags == 0x3ffffff;
}
代码的工作原理如下:我们考虑一个 int,它是一个 32 位数字。最多 26 位的每一位都是一个标志(可以说是一个 boolean
)。最初所有标志都是 false
,因为我们用 0
初始化 flags
。
现在我们遍历字符串的字符。如果字符是小写字母,我们将相应标志的标志设置为true
(不管之前是否设置为true
)。
最后我们检查最低 26 位是否都设置为 true
。如果是这样,flags
等于 0x3ffffff
(这是一个十六进制数,等于 1111111111111111111111
二进制数。如果是这样,我们返回 true
。否则我们返回 false
。
通常按位运算比 if
语句和 boolean 运算要快,所以我希望这个程序能快很多。
关于java - 高效的 Java 语言构造来检查字符串是否为 pangram?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37880301/