Java 在不使用条件的情况下返回2个可能参数的另一个参数
例如,如果我有一个函数保证接收5或7作为参数,我希望函数在不使用任何条件的情况下返回5(如果接收到7)和7(如果接收到5) 我在一次采访中被问到这一点,当时我非常困惑, 谢谢。简单算术: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中)在
返回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;
}