对于一个测试用例,按字典顺序比较字符串的新方法失败
Comparing Strings lexicographically new approach fails for one test case
我被要求检查 String a
是否在字典序上更大 String b
。因此,甚至在考虑 compareTo()
方法之前,我就有了一个新想法。
- 取 a 和 b 的最小长度。
- 重复 for 循环直到最小长度,并将每个字符的
ascii
的总和分别存储在 a 和 b 中。
- 比较
ascii
以打印结果。
这是我的代码
private static void isInLexicographicOrder(String a, String b) {
char[] arr1 = a.toCharArray();
int asciCount1 = 0;
char[] arr2 = b.toCharArray();
int asciCount2 = 0;
long asciLength = (a.length() < b.length()) ? a.length() : b.length();
for(int i=0; i<asciLength; i++) {
asciCount1 += arr1[i];
asciCount2 += arr2[i];
}
if(asciCount1 < asciCount2) {
System.out.println("In Lexicographic Order");
}
else {
System.out.println("Not In Lexicographic Order");
}
}
对于我提供的许多输入,它工作正常,然后我发现了这个 link String Comparison in Java,所以为了确认,我在我的代码中使用了比较方法。
System.out.println((a.compareTo(b)) < 0 ? "In Lexicographic Order" : "Not In Lexicographic Order");
现在,当我提交代码时,另一个网站说代码在一个测试用例中失败了
示例输入
vuut
vuuuuu
他们希望输出为 No
,即 Not In Lexicographic Order
。但是我的逻辑和 compareTo()
逻辑说 In Lexicographic Order
。那么怎么了,我的逻辑是完全正确的吗?
这是 link 我得到 Question. 如果我错了请见谅
你的逻辑不正确。比较字符的总和是错误的,因为 "bab"、"abb" 和 "bba" 将具有相同的值,但这并不能告诉您它们中哪个在字典序上排在第一位。
您应该分别比较每对字符。第一次遇到一对不相等的字符,值小的属于最先出现的String。
for(int i=0; i<asciLength; i++) {
if (arr1[i] > arr2[i]) {
System.out.println("Not In Lexicographic Order");
return;
} else if (arr1[i] < arr2[i]) {
System.out.println("In Lexicographic Order");
return;
}
}
// at this point we know that the Strings are either equal or one
// is fully contained in the other. The shorter String must come first
if (arr1.length <= arr2.length) {
System.out.println("In Lexicographic Order");
} else {
System.out.println("Not In Lexicographic Order");
}
comareTo
方法遍历两个字符串的字符,直到到达两个字符不同的位置。 return 值是两个代码点值之间的差异。
您的实现将所有代码点相加,求和 return 相加结果的差值。
使用值 abcd
和 dcba
尝试您的方法。我希望你的方法 return 0
而不是负数
我被要求检查 String a
是否在字典序上更大 String b
。因此,甚至在考虑 compareTo()
方法之前,我就有了一个新想法。
- 取 a 和 b 的最小长度。
- 重复 for 循环直到最小长度,并将每个字符的
ascii
的总和分别存储在 a 和 b 中。 - 比较
ascii
以打印结果。
这是我的代码
private static void isInLexicographicOrder(String a, String b) {
char[] arr1 = a.toCharArray();
int asciCount1 = 0;
char[] arr2 = b.toCharArray();
int asciCount2 = 0;
long asciLength = (a.length() < b.length()) ? a.length() : b.length();
for(int i=0; i<asciLength; i++) {
asciCount1 += arr1[i];
asciCount2 += arr2[i];
}
if(asciCount1 < asciCount2) {
System.out.println("In Lexicographic Order");
}
else {
System.out.println("Not In Lexicographic Order");
}
}
对于我提供的许多输入,它工作正常,然后我发现了这个 link String Comparison in Java,所以为了确认,我在我的代码中使用了比较方法。
System.out.println((a.compareTo(b)) < 0 ? "In Lexicographic Order" : "Not In Lexicographic Order");
现在,当我提交代码时,另一个网站说代码在一个测试用例中失败了
示例输入
vuut
vuuuuu
他们希望输出为 No
,即 Not In Lexicographic Order
。但是我的逻辑和 compareTo()
逻辑说 In Lexicographic Order
。那么怎么了,我的逻辑是完全正确的吗?
这是 link 我得到 Question. 如果我错了请见谅
你的逻辑不正确。比较字符的总和是错误的,因为 "bab"、"abb" 和 "bba" 将具有相同的值,但这并不能告诉您它们中哪个在字典序上排在第一位。
您应该分别比较每对字符。第一次遇到一对不相等的字符,值小的属于最先出现的String。
for(int i=0; i<asciLength; i++) {
if (arr1[i] > arr2[i]) {
System.out.println("Not In Lexicographic Order");
return;
} else if (arr1[i] < arr2[i]) {
System.out.println("In Lexicographic Order");
return;
}
}
// at this point we know that the Strings are either equal or one
// is fully contained in the other. The shorter String must come first
if (arr1.length <= arr2.length) {
System.out.println("In Lexicographic Order");
} else {
System.out.println("Not In Lexicographic Order");
}
comareTo
方法遍历两个字符串的字符,直到到达两个字符不同的位置。 return 值是两个代码点值之间的差异。
您的实现将所有代码点相加,求和 return 相加结果的差值。
使用值 abcd
和 dcba
尝试您的方法。我希望你的方法 return 0
而不是负数