Java 在不使用条件的情况下返回2个可能参数的另一个参数

Java 在不使用条件的情况下返回2个可能参数的另一个参数,java,Java,例如,如果我有一个函数保证接收5或7作为参数,我希望函数在不使用任何条件的情况下返回5(如果接收到7)和7(如果接收到5) 我在一次采访中被问到这一点,当时我非常困惑, 谢谢。简单算术: 返回7-输入+5 (可简化为返回12-输入;) 假设输入为7: 返回7-7+5-->返回5 或者如果输入为5: 返回7-5+5-->返回7 public int f(int x) { return x ^ 2; } 二进制: 7 = 111 5 = 101 2 = 010 XOR(^在java中)在

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

我在一次采访中被问到这一点,当时我非常困惑, 谢谢。

简单算术:

返回7-输入+5

(可简化为
返回12-输入;

假设输入为7:

返回7-7+5-->返回5

或者如果输入为5:

返回7-5+5-->返回7

public int f(int x) {
    return x ^ 2;
}
二进制:

7 = 111
5 = 101
2 = 010

XOR(^在java中)在关闭时翻转2位,在打开时翻转2位。

您可以使用任何可以反转的简单交换计算:

  • 添加:
    f(x)=7+5-x
  • 异或:
    f(x)=7^5^x
  • 乘法:
    f(x)=7*5/x

如果我是面试者,而你只是为了数字输入而解决这个问题,那么我的下一个问题将是,“你如何解决非数字输入的问题?”因为我不会寻求数学上的聪明。相反,这个怎么样

List<String> options = new ArrayList<>(Arrays.asList("bob", "fred"));
options.remove("bob");
System.out.println(options.get(0));
无论哪种情况,输出都明显是“fred”。如果我是面试的人,这就是我想要的答案


xor 1是如何工作的?[对于情况f(x)=7^5^x]

XOR(^)是异或,它是这样工作的

a|b|a^b
-------
0|0| 0
0|1| 1
1|0| 1
1|1| 0
因此,可以使用XOR(^)来更改某些数字的位。例如,当我们想将任何数字的最后两位(如
xxxx10
更改为
xxxx01
)时,我们可以使用
numbrer^3
来完成,因为3是二进制00011

这里有一些关于XOR的事实

  • 异或是对称的->
    a^b
    =
    b^a

  • 异或是关联的->
    (a^b)^c
    =
    a^(b^c)

  • a^a
    =
    0
    a
    中的那些将被替换为零,并且零不会被更改)

    a=157(二进制010011101)的示例

  • 0^a
    =
    a
    a
    中的一个只能将零更改为一)

  • 所以使用事实(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
    
    那么:

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


    +1,甚至
    返回12-输入
    这太不可思议了!你能分享一下这背后的思考过程吗?不,只是数学;)@这并不令人惊奇,这是数学!哪个。。。当然有时也会非常令人惊讶:)@SimonAndréForsberg true…)xor是如何工作的?xor的反面也是xor。在每个示例中,x将取消其中一个术语,而将另一个作为结果。xor将如何用java代码编写?简单返回7^5^x?是的,没错。你也可以用它的结果(2)代替7^5。注意,当且仅当a和b(而不是5和7)都非零时,你可以推广乘法方法。一个解释会很好!谢谢这与我的第二个例子基本相同,因为2=7^5@user2105338
    ^
    =异或运算符。查一下,你可能会学到更多。@aditsu,谢谢。我在想,出于某种原因,我不得不担心高阶位。+1在我看来,这是最好的解决方案,可能也是面试官想要的。我很确定remove()使用了一个条件,但我不确定这是否会被视为违反规则,或者至少Groovy版本违反了规则,因为至少在我所知道的所有编程语言中,
    it!=“bob”
    是一个条件。我喜欢这个答案,但我对“不使用任何条件”的解释不允许使用使用条件的方法。@user2105338:基本上,用这种方式解决问题表明,可以通过操纵公共数据结构来解决问题,这对开发人员来说是很有用的。如果你想出一个只解决数字问题的数学诀窍,那说明了什么?@Simon:“数学”不是一个简单的问题。我说的是功能与命令。这句话听起来和那种问题一模一样。虽然我认为这是一个很好的面试问题,因为它衡量了面试者快速解决简单问题的能力,但我认为这对这个网站来说不是一个很好的问题——它既琐碎又无用。我投票认为“太本地化了”。我刚刚意识到这只是一个重新措辞的“没有临时工的交换”问题,应该张贴在
    上。这是正确的答案,因为他们想雇佣一个编写代码的人,让读者明白易懂,与其说我比你聪明,不如在每次返回时都设圈套。+1代表联合国关于空间复杂性的建议:)这是一个很好的答案!喜欢它+1好答案和简单。虽然被接受的答案是好的,但我更喜欢这个,因为我不会去想它。我立刻想到了
    7mod input+5
    :)public intxyz(intx){return(12-x);}
    (x^7)^5 = (7^7)^5 = 0^5 = 5
    
    (x^5)^7 = (5^5)^7 = 0^7 = 7
    
    public int q(int in)
    {
        static final int[] ret = {0, 0, 0, 0, 0, 7, 0, 5};
        return ret[in];
    }
    
    public int xyz(int x) {
        return 35 / x;
    }