java - 谁能解释一下这段代码是如何工作的?

标签 java char anagram charat

我试图理解这段代码,它检查 2 个不同字符串的字谜。

int[] charSet = new int[256];

    for (int i = 0; i < sA.length(); i++) {
        charSet[sA.charAt(i)]++;
    }
    for (int i = 0; i < sB.length(); i++) {
        charSet[sB.charAt(i)]--;
    }

    int deletion = 0;
    for (int i = 0; i < 256; i++) {
        deletion += Math.abs(charSet[i]);
    }

    System.out.println("The amount of deletion needed: " + deletion);

我使用调试真正掌握了将 char 索引放入数组中的想法,但是当我检查数组的内容时,要么是 0,要么是 1。但是 sA.charat(i) 返回的字符串索引不是 0 或 1 吗?

所以 charSet[sA.charAt(i)]++; 根据我的理解,这段代码真正做了什么,它获取字符串的 char 索引并添加到​​数组中,但是什么是++ 的要点 ?

此外,更具体地说,deletion += Math.abs(charSet[i]); 这行代码是如何工作的,因为它所做的只是在其他。但我真的不明白这是如何检查 2 个字符串的字谜的。

如果有人能详细解释一下,我将不胜感激。

最佳答案

您似乎误解了charSet[sA.charAt(i)]++; 的目的和行为。一旦您理解为什么会有那条线,其他一切都会变得简单明了。

charSet 计算第一个字符串中每个字符的数量。例如,如果字符串是 aab,则 charSet 的索引 97 将为 2,索引 98 将为 1,其余全为0。 “a”的 int 值为 97,“b”的 int 值为 98。

第一个 for 循环遍历第一个字符串的每个字符。 charSet[sA.charAt(i)]++; 基本上将该字符的计数递增 1。对于字符串 aab,表达式的计算结果为:

// note that charAt(i) returns the character at index i of the string
charSet[97]++; // 1st iteration
charSet[97]++; // 2nd iteration
charSet[98]++; // 3rd iteration

现在第二个 for 循环对第二个字符串执行相反的操作。这一次,我们倒计时。为什么?因为如果这两个字符串是变位词,在对相同字符进行加法和减法计算后,我们最终会得到用 0 填充的 charSet

假设这两个字符串不是变位词。这意味着在前两个 for 循环之后,charSet 包含一些非 0。我们将这些非 0 的绝对值相加以获得需要添加/删除多少个字符才能使两个字符串变位词。


请注意,如果字符串包含值超过 256 的字符,此程序将崩溃!解决此问题的更好方法是使用 HashMap 来计算字符数。

关于java - 谁能解释一下这段代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51365734/

相关文章:

mysql - MySQL 查询速度能否取决于表大小?

c - 为什么在使用 "Quotes"创建 char* 时不需要释放内存

我的 Anagram 程序可以运行吗?如果是,为什么不编译?

java - 无法使用 App Engine 的 Java Mail 示例代码解析符号

java - 如何使用apachecamel从elasticsearch获取所有条目?

java - 将 Generic Arraylist 转换为具有 Generic Type 的数组

java - 在类中存储 byte[]

C sscanf 每次都转字符串的开头

python - 找到所有可能的 N 长度字谜 - 快速替代