布尔测试用例应该通过时失败

时间:2013-12-30 19:02:52

标签: java boolean

我对一些Java实践问题感到高​​兴,以帮助教我的一些朋友如何编码,而且令人尴尬的是,我在一个看似简单的测试用例中没有一个测试用例,并且看不出我做错了什么。练习题是:

给定2个int值,如果一个为负数且一个为正数,则返回true。除非参数negative为真,否则仅当两者都为负时才返回true。

我的代码是:

public boolean posNeg(int a, int b, boolean negative) {
  if(negative == true && (a < 0 && b < 0))
    return true;
  else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))
    return true;

  return false;
}

测试用例是:posNeg(1, -1, true) - &gt; false(我的输出为true,这是不正确的。)

7 个答案:

答案 0 :(得分:3)

较短的版本是

public boolean posNeg(int a, int b, boolean negative) {
    return (negative ? a & b : a ^ b) < 0;
}

这是有效的,因为a & b是否定的,如果两者都是负数而且a ^ b是负数,如果是1,则只有一个是负数。

如果您使用int时0 = false且1 = true而不是布尔值作为C(和字节代码),您可以编写

public int posNeg(int a, int b, int neg) {
    return (neg * (a & b) + (1 - neg) * (a ^ b)) >>> -1;
}

这里的一个技巧是>>> -1intlong提供最高位为0或1。

答案 1 :(得分:2)

你的输出没问题,你应该改变

if( negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))

if(  !negative &&  ( (a < 0 && b > 0)  || (a > 0 && b < 0) ) ) 
                   ^                                       ^

&&的作用类似于乘法

如果你有这个

negative == false && (a < 0 && b > 0) || (a > 0 && b < 0)

就像

 ( negative == false && (a < 0 && b > 0) )  || (a > 0 && b < 0)
 ^                                       ^

答案 2 :(得分:2)

尝试像这样简化它。

public boolean posNeg(int a, int b, boolean negative) {
  if (negative) return a < 0 && b < 0;
  else return 1L * a * b < 0L;
}

答案 3 :(得分:1)

这是罪魁祸首:

else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))

分解为:

else if(
    negative == false && (a < 0 && b > 0)
    ||
    (a > 0 && b < 0)
)

例如,如果negative之后的条件为真,则它不关心||的值,它遵循路径并返回true

你可能想在某处找到parens。我没有完全理解你的逻辑,但可能你的意思是:

else if(
    negative == false && (
        (a < 0 && b > 0)
        ||
        (a > 0 && b < 0)
    )
)

答案 4 :(得分:1)

public boolean posNeg(int a, int b, boolean negative)
{
  if(negative)
  {
      return a < 0 && b < 0;
  } else
  {
      return (long) a * b < 0;
  }
}

这是你所说的翻译。请注意检查是否只有一个是否定的智能方法:

  • - * - = +
  • - * + = -
  • + * - = -
  • + * + = +

但正如 @ peter.petrov 指出:如果你的整数太大,这可能会溢出。这就是为什么需要长时间的演员。因此,检查这个问题的更好方法是:

(a < 0) ^ (b < 0)

使用三元条件运算符,这是一个很好的单线程:

public static boolean posNeg(int a, int b, boolean negative)
{
    return negative ? a < 0 && b < 0 : ((a < 0) ^ (b < 0));
}

答案 5 :(得分:1)

问题似乎在于:

else if(negative == false && (a < 0 && b > 0) || (a > 0 && b < 0))

您正在编写(false和false或true),因此OR案例被评估为true,因此输入if语句。 尝试这样写:

else if (!negative && ((a < 0 && b > 0 ) || (a > 0 && b < 0)))

即:(false AND(false OR true)),每次评估负标志

答案 6 :(得分:1)

你也可以这样做:

public boolean posNeg(int a, int b, boolean negative) {
    int a1 = Integer.numberOfLeadingZeros(a);
    int b1 = Integer.numberOfLeadingZeros(b);
    return negative ? (a1 + b1) == 0 : ((a1 & b1) == 0 && (a1 != b1));
}

说明:

  • 如果否定为true,如果两个数字都为负数,则您希望返回true,这意味着两个数字的最左边的位都是1,因此numberOfLeadingZeros将为两者返回0。< / LI>
  • 如果为false为否定,那么如果为(a1 & b1 == 0),则表示其中一个数字为负数,但也可能表示两者为负数,因此您有检查a1 != b1