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

时间:2017-09-06 09:57:55

标签: java string string-comparison compareto lexicographic

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

  1. 取a&的最小长度湾
  2. 迭代for循环直到最小长度,并将每个字符的ascii之和存储在a& b分开。
  3. 比较ascii以打印结果。
  4. 这是我的代码

    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");
        }
    
    }
    

    对于我提供的许多输入,它工作得很好,然后我找到了这个链接String Comparison in Java,所以为了确认,我在代码中使用了compare方法。

    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。那么什么是错的,我的逻辑是完全正确的吗?

    这是我得到Question.的链接,如果我错了,我很抱歉

2 个答案:

答案 0 :(得分:2)

comareTo方法迭代两个字符串的字符,直到它到达两个字符不同的位置。返回值是两个代码点值之间的差异。

您的实现将所有代码点添加到总和中,并返回此添加结果的差异。

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

答案 1 :(得分:1)

你的逻辑不正确。比较字符的总和是错误的,因为“bab”,“abb”和“bba”将具有相同的值,但是它没有告诉你关于它们中的哪一个首先是词典的。

您应该分别比较每对字符。第一次遇到一对不相等的字符时,值较低的字符属于应该首先出现的字符串。

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");
}