我正在学习Java,在完成练习时,我偶然发现了CodingBats sameStarChar 计划中的一个问题。
我知道这是一个简单的练习,但不同结果背后的逻辑确实困扰着我。
当我写:
public boolean sameStarChar(String str) {
for (int i = 1; i < str.length() - 1; i++) {
if (str.charAt(i) == '*') {
if (str.charAt(i - 1) != str.charAt(i + 1))
return false;
}
}
return true;
}
所有结果都没问题。
但是当我更改代码并反转if
块中的条件并返回false
作为默认返回值时,代码不再起作用并且某些测试失败:
public boolean sameStarChar(String str) {
for (int i = 1; i < str.length() - 1; i++) {
if (str.charAt(i) == '*') {
if (str.charAt(i - 1) == str.charAt(i + 1))
return true;
}
}
return false;
}
你能否告诉我为什么结果会有所不同?我似乎无法在任何一本书中找到这方面的确切解释。
答案 0 :(得分:6)
密切关注代码的作用,用英语:
*
:
你得到完全不同结果的原因是因为你完全翻转了程序的逻辑。这是你的代码,再用英文:
*
:
您尚未将false
设为默认返回选项; 你已经颠倒了整个程序的逻辑。考虑空字符串,这是一个有效的测试用例。你的代码说这是无效的,当字符串中没有星号时(这将是一个奇怪的误报)。
答案 1 :(得分:0)
第一种情况有效,因为只有当*
前面跟着相同的字符或者string
根本不包含*
时才返回true。
第二种情况不起作用,因为如果它包含至少一个*
,则返回true,并且*
的第一个实例前面和后面跟着相同的字符,而不管{{的下一个实例1}}。因此,如果传递一个空字符串,它应返回true,但它返回false,因为它不包含*
。如果传递了另一个字符串*
,则第二个程序将返回true,因为*xa*a*b
的实例遵循约定。第二个程序将立即返回true,在首次出现之后忽略所有*
。