我对一些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,这是不正确的。)
答案 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;
}
这里的一个技巧是>>> -1
为int
和long
提供最高位为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
。