Welcome

首页 / 软件开发 / 数据结构与算法 / 技术面试题:f(f(n)) == -n

技术面试题:f(f(n)) == -n2011-12-16 博客园 隐约有歌最近遇到的一个技术面试题,在这里分享一下。题目是设计一个函数 f,使得

f(f(n)) = -n

这里 n 是一个 32 比特的整数。不可以使用虚数运算或者复数运算。

如果你无法设计出一个函数使得其对32比特下的所有整数都适用,那么设计此函数使得其能够适用于尽可能多的整数。

Design a function f, such that: f(f(n)) == -nWhere n is a 32 bit signed integer; you can"t use complex numbers arithmetic.If you can"t design such a function for the whole range of numbers, design it for the largest range possible.
尝试一:

对于支持函数内置状态的语言,比如C语言来说,可以很容易的解决这个面试题。如下的代码即可:

// C/C++int f(int n) {    static int state = -1;    state *= -1;    return n * state;}
这里定义了一个函数内置状态变量 state。第一次执行函数 f 的时候,state 等于 1,函数返回 n。第二次执行该函数的时候,state 等于 -1,函数返回 -n。这个解法能适用于除了 INT_MIN 之外的所有 32 比特整数。对于 INT_MIN,求负会导致溢出,也即 f(f(INT_MIN)) = INT_MIN。

当然,这个题目不应该是那么容易解决的。若是用不支持内置状态的语言,比如 C# 或者 Java,应该如何解决?

尝试二:

可以使用全局变量,来存储状态。比如如下的 C# 代码:

private static int state = -1;public static int f(int i) {    state *= -1;    return state * i;}
但是这个解法依然不完美,感觉题意不是如此。