Designing function f(f(n)) == -n

849

我上次面试时收到的一个问题:

设计一个函数f,使得:

f(f(n)) == -n

n 是一个32位的有符号整数时,你不能使用复数运算。

如果你不能为所有数字范围设计这样的函数,那就尽可能地为最大范围设计。

有什么想法吗?


6
这次面试是为了什么职位? - tymtam
120个回答

1

在Python中

f=lambda n:n[0]if type(n)is list else[-n]

1

好问题!

我花了大约35秒来思考和写作:

int f(int n){
    static int originalN=0;
    if (n!=0)
        originalN=n;
    return n-originalN;
}

绝对是作弊...但对于所有的n值都有效,并且很简单。x)起初我以为它只能在第一次调用f(f(n))时工作(因为静态初始化),但实际上每次连续调用都可以工作。+1 - Tim Leaf
本质上,这个答案的想法是对一个同样俏皮的问题的俏皮回应。难道真的应该根据这样的问题来雇用(或不雇用)计算机科学家/软件工程师吗? - Cam

1

另一种方法是将状态保留在一个位中,并在处理负数的二进制表示时小心地翻转它... 限制为2^29

int ffn(int n) {

    n = n ^ (1 << 30); //flip the bit
    if (n>0)// if negative then there's a two's complement
    {
        if (n & (1<<30))
        {
            return n;
        }
        else
        {
            return -n;
        }
    }
    else
    {
        if (n & (1<<30))
        {
            return -n;
        }
        else
        {
            return n;
        }
    }


}

1
number f( number n)
{
  static count(0);
  if(count > 0) return -n;
  return n;
}

f(n) = n

f(f(n)) = f(n) = -n

3
我认为你漏掉了一个 count++ - sth
@sth - 哈哈!是啊,该喝我的茶了!还有巧克力饼干! - Sam

1
int f(int n) {
    return ((n>0)? -1 : 1) * abs(n);
}

适用于所有int值,除了MIN_INT(因为MIN_INT * -1> MAX_INT),因此对于它没有有效的返回值。 - Steven
1
这只会返回 f(n)=-n 吧? 那么 f(f(n)) = n,而不是问题所问的 -n。 - Sanjay Manohar

1
这样怎么样:
do
    local function makeFunc()
        local var
        return function(x)
            if x == true then
                return -var
            else
                var = x
                return true
            end
        end

    end
    f = makeFunc()
end
print(f(f(20000)))

1

C++

struct Value
{
  int value;
  Value(int v) : value(v) {}
  operator int () { return -value; }
};


Value f(Value input)
{
  return input;
}

1

与函数重载的解决方案相似,在Python中:

def f(number):
 if type(number) != type([]):
  return [].append(number)
 else:
  return -1*number[0]

替代方案:静态数据成员


1

JavaScript 一行代码:

function f(n) { return ((f.f = !f.f) * 2 - 1) * n; }

线程是什么?JavaScript 至少在浏览器上是单线程的。 - Anurag

1
问题描述并不要求函数必须仅接受32位整数,只要n作为给定值是32位整数即可。
Ruby:
def f( n )
  return 0 unless n != 0 
  ( n == n.to_i ) ? 1.0 / n : -(n**-1).to_i
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接