对于一个测试用例,按字典顺序比较字符串的新方法失败

Comparing Strings lexicographically new approach fails for one test case

我被要求检查 String a 是否在字典序上更大 String b。因此,甚至在考虑 compareTo() 方法之前,我就有了一个新想法。

  1. 取 a 和 b 的最小长度。
  2. 重复 for 循环直到最小长度,并将每个字符的 ascii 的总和分别存储在 a 和 b 中。
  3. 比较 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 相加结果的差值。

使用值 abcddcba 尝试您的方法。我希望你的方法 return 0 而不是负数