我上周被问到一个面试问题:
我需要一个函数来打印数字是正数还是负数而不使用if else
while
for
switch
a? b:c
等条件语句。我能做到吗
我告诉采访者,这个问题本质上是“有条件的”是不可能的。他告诉我这是可能的,但没告诉我怎么做。我做了很多搜索,但没有很好的答案。
答案 0 :(得分:19)
一种可能的解决方案:
String[] responses = {"Positive", "Negative"};
System.out.println(responses[(i >> 31) & 1]);
这也将零视为正数。
因为Java中的整数需要存储在two's complement中(或表现得像它们一样),所以任何负数的最高位都是1,而任何其他数字的最高位都是0. {{1将最高位复制到每个其他位(因此负数变为(i >> 31)
,正数/零数变为11111111 11111111 11111111 11111111
)。 00000000 00000000 00000000 00000000
将除最低位之外的所有位设置为0.组合& 1
实际上只读取(i >> 31) & 1
的最高位。
答案 1 :(得分:5)
这是一个变体,说明零既不是正面的也不是负面的:
int x = (int)Math.sqrt(Math.pow(n, 2));
try {
x = n / x;
}
catch (ArithmeticException e) {
x = 0;
}
String[] result = {"negative", "zero", "positive"};
System.out.println(result[x + 1]);
答案 2 :(得分:5)
请详细说明一下immibis的回答:
int index(int i) {
return 1 + (i>>31) - (-i>>31);
}
String[] text = {"negative", "zero", "positive"};
private String text(int i) {
return text[index(i)];
}
已签名的班次i>>31
会将每个负数转换为-1
,将其他每个转换为0
。计算-i>>31
允许从非正数计算正数。现在看一下计算出来的index
:
positive: 1 + 0 - (-1) = 2
zero: 1 + 0 - 0 = 1
negative: 1 + (-1) - 0 = 0
答案 3 :(得分:2)
超级简单的解决方案滥用数组不能具有负大小的事实:
void printPositive(int i) {
try { new int[i]; System.out.println("positive"); }
catch( NegativeArraySizeException e) { System.out.println("negative"); }
}
好吧,如果i
为正,这个答案可能会分配一个庞大的数组,而VM在评估new int[i]
时可能会使用条件,但至少它会向采访者展示某种创造力。此外,它可能会向采访者显示你可以开箱即用(因为他可能会预期你会像其他大多数答案一样使用魔法)并做一些完全不同的事情。
答案 4 :(得分:1)
Old answer。我之所以提出这个新答案是因为我使用的是布尔的compareTo
方法,它使用三元运算符将布尔表达式转换为二进制。
这是我的新答案,更难以理解。
public static String positiveOrNegative(int n) {
ArrayList<String> responses = new ArrayList<String>();
// first element should be "Zero", so if n is 0, the response is "Zero"
responses.add("Zero");
// this populates the ArrayList with elements "Positive" for n elements
// so that if n is positive, n will be an index in the ArrayList
// and the return will be "Positive"
// but still if n is negative, it will never be an index in the ArrayList
for (int i = 0; i < n; i++) {
responses.add("Positive");
}
String response = "";
try {
// try to get a response from the ArrayList
response = responses.get(n);
} catch (Exception e) {
// index is out of bounds, so it must have been negative
response = "Negative";
}
return response;
}
public static void main(String[] args) {
System.out.println(positiveOrNegative(4)); // Positive
System.out.println(positiveOrNegative(1)); // Positive
System.out.println(positiveOrNegative(0)); // Zero
System.out.println(positiveOrNegative(-1)); // Negative
System.out.println(positiveOrNegative(-4)); // Negative
}
答案 5 :(得分:0)
另一种可能的解决方案:
boolean isPositive(int n) {
return n > ((n + 1) % n);
}
但它对0
无效。
----编辑-----
新算法:
String isPositive(int n) {
String[] results = {"-", "", "+"};
return results[1+(1+((n+1)%n)*((n-1)%n))/n];
}
它仍不适用于0
。
答案 6 :(得分:0)
伙计们,它并不是很难,不需要移位或进行奇怪的调用,只需使用Math类中的signum方法! ; P
http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#signum%28float%29