返回2个可能的论点的另一个论点,而不使用条件

例如,如果我有一个保证接收5或7作为参数的函数,我希望函数返回5如果收到7和7如果收到5不使用任何条件。

我在接受采访时被问到了这个问题,非常难过,谢谢。

简单的算术:

return 7 - input + 5;

(可以简化为return 12 - input;

假设input是7:

返回7 – 7 + 5 – >返回5

或者如果input是5:

返回7 – 5 + 5 – >返回7

您可以使用任何可以颠倒的简单交换计算:

  • 加法: f(x)=7+5-x
  • xor: f(x)=7^5^x
  • 乘法: f(x)=7*5/x
 public int f(int x) { return x ^ 2; } 

在二进制中:

 7 = 111 5 = 101 2 = 010 

XOR(^在java中)如果closures,则打开2位,如果打开则closures。

怎么样:

 public int q(int in) { static final int[] ret = {0, 0, 0, 0, 0, 7, 0, 5}; return ret[in]; } 

如果我曾经是一个面试,而你只是为了数字input而解决了这个问题,那么我的下一个问题就是:“如何解决非数字input的问题? 因为我不会找math的聪明。 相反,这个怎么样?

 List<String> options = new ArrayList<>(Arrays.asList("bob", "fred")); options.remove("bob"); System.out.println(options.get(0)); 

这显然可以很容易地适应任何types,包括Object ,只要Object的平等性能够正确地工作,作为奖励,它可以在其他语言(如Groovy)中更简洁地expression:

 println((["bob", "fred"] - "bob").first()) 

在任何情况下,输出显然都是“fred”。 如果我是面试的人,这就是我要找的答案。

 public int xyz(int x) { return 35 / x; } 

xor如何工作? [for case f(x)= 7 ^ 5 ^ x]

异或(^)是异或并且以这种方式工作

 a|b|a^b ------- 0|0| 0 0|1| 1 1|0| 1 1|1| 0 

所以异或(^)可以用来改变一些数字的位。 例如,当我们想要改变任何数字的最后两位时(比如xxxx10xxxx01 ),我们可以用numbrer ^ 3来做,因为3是二进制00011。

这里是关于异或的一些事实

  1. XOR是对称的 – > a^b = b^a
  2. XOR是关联的 – > (a^b)^c = a^(b^c)
  3. a^a = 0a将被replace为零,零不会被更改)

    例如a = 157(二进制010011101)

      010011101 ^ 010011101 ----------- 000000000 
  4. 0^a = aa中只能改变零,所以他们会改变他们)

      000000000 ^ 010011101 ----------- 010011101 

所以使用事实(1)和(2) 7^5^x == x^7^5 == x^5^7

让我们试着检查一下x^7^5 x=7如何工作的。

 (x^7)^5 = (7^7)^5 = 0^5 = 5 

x=5

 (x^5)^7 = (5^5)^7 = 0^7 = 7