我被要求检查String a
是否在字典上更大String b
。因此,在考虑compareTo()
方法之前,我得到了一个新想法。
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");
}
}
对于我提供的许多输入,它工作得很好,然后我找到了这个链接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.的链接,如果我错了,我很抱歉
答案 0 :(得分:2)
comareTo
方法迭代两个字符串的字符,直到它到达两个字符不同的位置。返回值是两个代码点值之间的差异。
您的实现将所有代码点添加到总和中,并返回此添加结果的差异。
尝试使用值为abcd
和dcba
的方法。我希望您的方法返回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");
}