谁能解释一下这段代码是如何工作的?
Can anyone explain how this block of code work?
我试图理解这段代码,它检查 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)
returns 字符串的索引不是0或1吗?
所以 charSet[sA.charAt(i)]++;
根据我的理解,这段代码真正做了什么它获取字符串的字符索引并添加到数组但是 ++
的意义是什么?
此外,更具体地说,deletion += Math.abs(charSet[i]);
这行代码是如何工作的,因为它所做的只是将一个数组的相应索引添加到另一个数组之上。但我真的不明白这是如何检查 2 个字符串的字谜的。
如果有人能详细解释一下,我将不胜感激。
charSet 表示 char 原始类型的 256 个不同的可能值。
正如 biziclop 和 Andreas 在评论中指出的那样,还有很多。
迭代两个字符串,本质上是字符数组。
charSet 数组基本上记录了字符串中每个字符的出现次数。
对于第一个字符串,每次出现计数加一,对于第二个字符串,计数减一。因此,如果字符串是彼此的变位词,则 charSet 数组中的每个 int 都应为 0。
最后,迭代 charSet 数组以总结字符串之间缺失的字符。您可以将删除变量视为字符串之间差异的度量。
字谜是可以通过重新排列另一个单词的字母而形成的单词或短语。例如 pale -> leap
。这两个词使用同一组字母,即 l, a, p, e
您共享的代码遵循的逻辑是初始化一个长度为 256 的空整数数组,以包含所有小写、大写、特殊字符等。
它首先遍历第一个字符串中的每个字母,并增加整数数组中字母的 ascii 值的计数。
然后循环遍历第二个字符串中的每个字母,并减少整数数组中字母的 ascii 值的计数。
这背后的逻辑是,如果两个字符串都是变位词,这意味着它们使用同一组字符。如果是这种情况,那么在两次迭代之后,int 数组中每个元素的值仍将保持为零。如果任何值大于或小于零,则意味着两个字符串中使用的字母存在差异,因此它们不是变位词。
public static int getDeletion(String sA, String sB) {
//this creates an array with 256 items, so that is an item for all the characters.
int[] charSet = new int[256];
//This goes through each letter of sA, and it increments the value at the value of the current letter in ASCII
//So if the first letter is A , it will increment the 65th item of charSet, because 65 is the ASCII value of a.
//It does this for all letters of sA.
for (int i = 0; i < sA.length(); i++) {
charSet[sA.charAt(i)]++;
}
//It does the same here for sB, but it subtracts the value.
for (int i = 0; i < sB.length(); i++) {
charSet[sB.charAt(i)]--;
}
//now we have at each item of charSet the amount of difference between the two strings for each letter.
//So if sA has 2 As and sB has 1 A, item 65 of charSet will be 1.
//If sA has 1 A and sB has 2 As, item 65 of charSet will be -1.
int deletion = 0;
for (int i = 0; i < 256; i++) {
//Here we add the amount of difference from each character to the 'deletion' variable. This will give us a total difference score.
//The Math.abs() makes sure the item is positive (so -5 will become 5).
deletion += Math.abs(charSet[i]);
}
return deletion;
//So say we compare "adc" and "bca". After the 2nd for loop, each item of charSet is 0, except value 98 and 100
//(ASCII value for b and c respectively).
//value 98 will be -1, because sB has 1 more b than sA
//value 100 will be 1, because sA has 1 more d than sB
//The -1 will be converted to a 1, because of the Math.abs()
//So in the for loop every value is added up to become 2, which is returned.
}
您似乎误解了 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 循环对第二个字符串执行相反的操作。这一次,我们倒计时。为什么?因为如果这两个字符串是变位词,我们最终会得到 charSet
以 0 填充,在对字符进行向上计数和对相同字符进行向下计数之后。
假设这两个字符串不是变位词。这意味着在前两个 for 循环之后,charSet
包含一些非 0。我们将这些非 0 的绝对值相加,得到需要多少个字符 added/removed 才能使两个字符串变位。
请注意,如果字符串包含值超过 256 的字符,此程序将崩溃!解决此问题的更好方法是使用 HashMap
来计算字符数。
我试图理解这段代码,它检查 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)
returns 字符串的索引不是0或1吗?
所以 charSet[sA.charAt(i)]++;
根据我的理解,这段代码真正做了什么它获取字符串的字符索引并添加到数组但是 ++
的意义是什么?
此外,更具体地说,deletion += Math.abs(charSet[i]);
这行代码是如何工作的,因为它所做的只是将一个数组的相应索引添加到另一个数组之上。但我真的不明白这是如何检查 2 个字符串的字谜的。
如果有人能详细解释一下,我将不胜感激。
charSet 表示 char 原始类型的 256 个不同的可能值。 正如 biziclop 和 Andreas 在评论中指出的那样,还有很多。
迭代两个字符串,本质上是字符数组。 charSet 数组基本上记录了字符串中每个字符的出现次数。 对于第一个字符串,每次出现计数加一,对于第二个字符串,计数减一。因此,如果字符串是彼此的变位词,则 charSet 数组中的每个 int 都应为 0。
最后,迭代 charSet 数组以总结字符串之间缺失的字符。您可以将删除变量视为字符串之间差异的度量。
字谜是可以通过重新排列另一个单词的字母而形成的单词或短语。例如 pale -> leap
。这两个词使用同一组字母,即 l, a, p, e
您共享的代码遵循的逻辑是初始化一个长度为 256 的空整数数组,以包含所有小写、大写、特殊字符等。
它首先遍历第一个字符串中的每个字母,并增加整数数组中字母的 ascii 值的计数。
然后循环遍历第二个字符串中的每个字母,并减少整数数组中字母的 ascii 值的计数。
这背后的逻辑是,如果两个字符串都是变位词,这意味着它们使用同一组字符。如果是这种情况,那么在两次迭代之后,int 数组中每个元素的值仍将保持为零。如果任何值大于或小于零,则意味着两个字符串中使用的字母存在差异,因此它们不是变位词。
public static int getDeletion(String sA, String sB) {
//this creates an array with 256 items, so that is an item for all the characters.
int[] charSet = new int[256];
//This goes through each letter of sA, and it increments the value at the value of the current letter in ASCII
//So if the first letter is A , it will increment the 65th item of charSet, because 65 is the ASCII value of a.
//It does this for all letters of sA.
for (int i = 0; i < sA.length(); i++) {
charSet[sA.charAt(i)]++;
}
//It does the same here for sB, but it subtracts the value.
for (int i = 0; i < sB.length(); i++) {
charSet[sB.charAt(i)]--;
}
//now we have at each item of charSet the amount of difference between the two strings for each letter.
//So if sA has 2 As and sB has 1 A, item 65 of charSet will be 1.
//If sA has 1 A and sB has 2 As, item 65 of charSet will be -1.
int deletion = 0;
for (int i = 0; i < 256; i++) {
//Here we add the amount of difference from each character to the 'deletion' variable. This will give us a total difference score.
//The Math.abs() makes sure the item is positive (so -5 will become 5).
deletion += Math.abs(charSet[i]);
}
return deletion;
//So say we compare "adc" and "bca". After the 2nd for loop, each item of charSet is 0, except value 98 and 100
//(ASCII value for b and c respectively).
//value 98 will be -1, because sB has 1 more b than sA
//value 100 will be 1, because sA has 1 more d than sB
//The -1 will be converted to a 1, because of the Math.abs()
//So in the for loop every value is added up to become 2, which is returned.
}
您似乎误解了 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 循环对第二个字符串执行相反的操作。这一次,我们倒计时。为什么?因为如果这两个字符串是变位词,我们最终会得到 charSet
以 0 填充,在对字符进行向上计数和对相同字符进行向下计数之后。
假设这两个字符串不是变位词。这意味着在前两个 for 循环之后,charSet
包含一些非 0。我们将这些非 0 的绝对值相加,得到需要多少个字符 added/removed 才能使两个字符串变位。
请注意,如果字符串包含值超过 256 的字符,此程序将崩溃!解决此问题的更好方法是使用 HashMap
来计算字符数。