-3
int function(int a, int b, int c){
        if(a==c)
            return a;
        else 
            return b;
    }

问题是在不使用 if、while、do、for、switch、条件表达式(?:) 和其他通用内置方法(如 equals)的情况下实现相同的 o/p

请告诉我逻辑和代码..

4

6 回答 6

4

这是一个相当简单的选择:

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 语句可能是一种滥用。

于 2013-05-19T02:26:05.460 回答
3

有许多可能的方法,包括:

  1. 在本机代码中进行测试。那是作弊。

  2. 找到一些可以用来完成这项工作的库类。这种方法可能有很多变化。例如见@Cairnarvon 的回答。

  3. 根据输入做一些棘手的事情来生成(或不)异常。我最初的想法是使用除以零,但这是另一种方式......

    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;
    }
    
  4. 有点旋转......就像@Vlad的回答


无论如何,面试问题的重点不是答案,而是你是否能够跳出框框思考得出什么结论。最实际的答案是“改变要求……这太疯狂了”。

于 2013-05-19T02:31:44.320 回答
3

我真的希望我想出 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);
}
于 2013-05-19T02:39:42.510 回答
3

这是一种仅使用运算符的方法:

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;
}
于 2013-05-19T02:56:50.143 回答
1

其他方式

基本想法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);
}
于 2013-05-19T03:46:28.760 回答
0

你去吧,没有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和都添加cSet. 如果它们相等,它们只会被添加一次,并且集合的大小将为1. 如果它们不同,则大小将为2.

于 2013-05-19T05:41:21.527 回答