int function(int a, int b, int c){
if(a==c)
return a;
else
return b;
}
问题是在不使用 if、while、do、for、switch、条件表达式(?:) 和其他通用内置方法(如 equals)的情况下实现相同的 o/p
请告诉我逻辑和代码..
int function(int a, int b, int c){
if(a==c)
return a;
else
return b;
}
问题是在不使用 if、while、do、for、switch、条件表达式(?:) 和其他通用内置方法(如 equals)的情况下实现相同的 o/p
请告诉我逻辑和代码..
这是一个相当简单的选择:
int function(int a, int b, int c) {
java.util.HashMap<Boolean, Integer> map = new java.util.HashMap<Boolean, Integer>();
map.put(true, a);
map.put(false, b);
return map.get(a == c);
}
使用映射来模拟没有它们的语言中的 switch 语句是很常见的。使用它们来模拟 if 语句可能是一种滥用。
有许多可能的方法,包括:
在本机代码中进行测试。那是作弊。
找到一些可以用来完成这项工作的库类。这种方法可能有很多变化。例如见@Cairnarvon 的回答。
根据输入做一些棘手的事情来生成(或不)异常。我最初的想法是使用除以零,但这是另一种方式......
int insanelyStupidConditional (int a, int b, int c) {
int[] dummy = new int[1];
try {
int foo = dummy[a - c];
} catch (ArrayIndexOutOfBoundsException ex) {
return b;
}
return a;
}
有点旋转......就像@Vlad的回答
无论如何,面试问题的重点不是答案,而是你是否能够跳出框框思考得出什么结论。最实际的答案是“改变要求……这太疯狂了”。
我真的希望我想出 Cairnarvon 的解决方案。这就是我得到的,但无论如何你最终都会在函数调用中隐藏的某个地方使用条件语句,除非你能弄清楚如何使用位运算符来做到这一点。
public static int fn(int a, int b, int c) {
Boolean equal = (a == c);
//if equal is false, compareTo will return 0.
//if equal is true, compareTo will return any positive integer, thus we take mod 2 to ensure this is 1
int ret_a = equal.compareTo(Boolean.FALSE) % 2;
//if ret_a is 0, make ret_b = 1
//if ret_a is 1, make ret_b = 0
int ret_b = (ret_a + 1) % 2;
//one of these two terms is guaranteed to be zero, therefore you will only
//return the value of a, or b.
return (ret_a * a) + (ret_b * b);
}
这是我在没有比较或有点玩弄的解决方案上的尝试。可悲的是,@Pshemo 指出我的逻辑有缺陷。
public static int fn(int a, int b, int c) {
//I assumed this will return 1 if not a != c
//See Pshemo's comment about why this is wrong.
int not_equal = ((a - c) * (a - c) ) % 2;
int ret_a = (not_equal + 1) % 2;
int ret_b = not_equal;
//one of these two terms is guaranteed to be zero, therefore you will only
//return the value of a, or b.
return (ret_a * a) + (ret_b * b);
}
这是一种仅使用运算符的方法:
int function(int a, int b, int c) {
//If a == c: result = 0x00000000
//Else: result = 0xFFFFFFFF
int result = (a - c | c - a) >> 31;
//If a == c: result = 0x00000000 & (a ^ b) = 0
//Else: result = 0xFFFFFFFF & (a ^ b) = a ^ b
result &= a ^ b;
//If a == c: result = 0 ^ a = a
//Else: result = (a ^ b) ^ a = b
result ^= a;
return result;
}
其他方式
基本想法return b * f(a,c) + a * (1 - f(a,c))
在哪里
f(a,c) -> 1
为了a != c
f(a,c) -> 0
为了a == c
所以
a!=c
我们会回来b*(1) + a*(0);
a==c
我们会回来b*(0) + a*(1);
代码
public static int test(int a, int b, int c) {
// (a - c) | (c - a) will give
// for a != b negative value
// for a == c zero
// to get sign of that value we need to get highest bit
// so >>>31 will do the trick
int signum = ((a - c) | (c - a)) >>> 31;
//for a == c -> signum = 0
//for a != c -> signum = 1 (it indicates that (a - c) | (c - a) was negative)
return b * signum + a * (1 - signum);
}
你去吧,没有if
, while
, do
, for
, switch
, inline if(?:)
或任何其他运算符(==
, !=
, >
, <
, >=
, 等):
int function(int a, int b, int c){
int[] result = {-1, a, b};
return result[new TreeSet<Integer>(Arrays.asList(a, c)).size()];
}
逻辑:将a
和都添加c
到Set
. 如果它们相等,它们只会被添加一次,并且集合的大小将为1
. 如果它们不同,则大小将为2
.