我上次面试时收到的一个问题:
设计一个函数
f
,使得:f(f(n)) == -n
当
n
是一个32位的有符号整数时,你不能使用复数运算。如果你不能为所有数字范围设计这样的函数,那就尽可能地为最大范围设计。
有什么想法吗?
在PHP中
function f($n) {
if(is_int($n)) {
return (string)$n;
}
else {
return (int)$n * (-1);
}
}
很简单!
例如:
规则如下:
0 → 0
±2³¹ → ±2³¹
奇数→偶数,偶数→-奇数:
对于所有k,0
唯一不匹配的值是±(2³¹-1),因为只有两个。 必须有两个不能匹配,因为在二进制补码系统中只能有四的倍数个数字,其中0和±2³¹已经被保留。
在一进制补码系统中,存在+0和-0。我们这样做:
对于所有k,0
我有另一种解决方案,但只能有一半的成功率:
def f(x):
if random.randrange(0, 2):
return -x
return x
由于对f(x)的输出没有限制,只要考虑f(f(x))就行了,这使得Python的解决方案变得简单易行:
def f(x):
return (isinstance(x, tuple) and -x[0]) or (x,)
(x)
返回 x
。我认为你的意思是 (x,)
。 - seppo0010def f(n):
if isinstance(n,int):
return str(n)
else:
return -int(n)
int nasty(int input)
{
return input + INT_MAX/2;
}
虽然问题说n必须是32位整数,但它并没有说参数或返回类型必须是32位整数。这应该可以在Java中编译-在C中,您可以摆脱!= 0。
private final long MAGIC_BIT=1<<38;
long f(long n) {
return n & MAGIC_BIT != 0 ? -(n & !MAGIC_BIT) : n | MAGIC_BIT;
}
编辑:
这实际上是一个非常好的面试问题。最好的问题是那些难以回答或不可能回答的问题,因为它迫使人们去思考,你可以观察和寻找:
等等。
除非你有非常好的答案,否则永远不要只回答行为问题。始终保持愉快,并尝试让提问者参与进来。不要感到沮丧,也不要轻易放弃!如果你真的没有任何头绪,试试一些完全不合法但可能有效的方法,你将得到几乎满分。
我认为这类问题的答案最好通过使用图示来进行解释。当我们忽略零时,我们可以将整数划分为4个数字的小集合:
1 → 2 3 → 4 5 → 6
↑ ↓ ↑ ↓ ↑ ↓ ...
-2 ← -1 -4 ← -3 -6 ← -5
这段内容很容易转换为代码。请注意,偶数会改变符号,奇数会增加或减少1。在C#中,它看起来像这样:
public static int f(int x)
{
if(x == 0)
return 0;
if(x > 0)
return (x % 2 == 0) ? -x+1 : x+1;
// we know x is negative at this point
return (x % 2 == 0) ? -x-1 : x-1;
}
int f( int n ){
return n==0?0:(n&1?n:-n)+(n<0?-1:1);
}
int f (int num) {
if (rand () / (double) RAND_MAX > 0.5)
return ~num + 1;
return num;
}