不使用java中的条件语句检查正面或负面

时间:2014-06-29 05:29:27

标签: java

我上周被问到一个面试问题:

我需要一个函数来打印数字是正数还是负数而不使用if else while for switch a? b:c等条件语句。我能做到吗

我告诉采访者,这个问题本质上是“有条件的”是不可能的。他告诉我这是可能的,但没告诉我怎么做。我做了很多搜索,但没有很好的答案。

7 个答案:

答案 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