java - 高效的 Java 语言构造来检查字符串是否为 pangram?

标签 java algorithm performance optimization pangram

到目前为止,我已经想到了这个。我试图最小化字符串操作并将解决方案隔离到内置数据类型、数组和整数操作。

我正在寻找更优雅的方法来检查 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;
}

jDoodle

代码的工作原理如下:我们考虑一个 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/

相关文章:

algorithm - 梯度下降和爬山之间的行为差​​异

java - 了解 Java 中合并排序算法的关键操作计数

linux - 优化一行 find + exec 命令

Javascript 在点击时更改整个 div

java - 设置迭代器的 Java 泛型

java - 如何在 Java 中的通用方法中创建安全的 createQuery?

algorithm - 不清楚为什么这种硬币找零算法有效

python - 将文件中的 4000 万行与 Python 中的 600 万个列表项进行比较

java - 什么是 Guava 的 SingletonImmutableBiMap

java - HttpURLConnection 类的 setDoOutput 和 setDoInput 方法有什么用