我上次面试时收到的一个问题:
设计一个函数
f
,使得:f(f(n)) == -n
当
n
是一个32位的有符号整数时,你不能使用复数运算。如果你不能为所有数字范围设计这样的函数,那就尽可能地为最大范围设计。
有什么想法吗?
在Python中
f=lambda n:n[0]if type(n)is list else[-n]
好问题!
我花了大约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另一种方法是将状态保留在一个位中,并在处理负数的二进制表示时小心地翻转它... 限制为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;
}
}
}
number f( number n)
{
static count(0);
if(count > 0) return -n;
return n;
}
f(n) = n
f(f(n)) = f(n) = -n
count++
。 - sthint f(int n) {
return ((n>0)? -1 : 1) * abs(n);
}
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)))
C++
struct Value
{
int value;
Value(int v) : value(v) {}
operator int () { return -value; }
};
Value f(Value input)
{
return input;
}
与函数重载的解决方案相似,在Python中:
def f(number):
if type(number) != type([]):
return [].append(number)
else:
return -1*number[0]
替代方案:静态数据成员
JavaScript 一行代码:
function f(n) { return ((f.f = !f.f) * 2 - 1) * n; }
def f( n )
return 0 unless n != 0
( n == n.to_i ) ? 1.0 / n : -(n**-1).to_i
end