题目是这样的:请设计一个函数f(n),n是int32,让f(f(n))==-n对所有n成立? 要求不允许使用复数类的运算,不限制语言。如果不存在满足整个int32的f(n),那么尽可能让它对更多int32范围的n成立。
大拿的解法是:对于任意正奇数n,构造循环表[n,n+1,-n,-n-1]。这样就把所有数划分成了不相交的表,f(x)只要返回x所在的表中x的后继元素即可。剩下4个数未解决:0, INT_MAX, INT_MIN, -INT_MAX。显然INT_MIN无解。用同样的方法可以干掉INT_MAX和-INT_MAX,代价是f(f(0))=INT_MIN。
本题在stackoverflow上面的讨论地址为http://stackoverflow.com/questions/731832/interview-question-ffn-n?answertab=oldest#tab-top
因为没有限制语言,所以我用javascript实现,思路如下:
用c记录调用次数,c%2==0,f(n)=n;c%2==1,f(n)=-n,一定能保证f(f(n))=-n;理解:调用里面的f(n)时,c为奇或偶,奇则f(n)=-n,在调用外层f时c为偶,不变输出-n;如果调用里面f(n),c为偶,则f(n)=n,当调用外层f时,c为奇,取反输出-n。
代码:
var f=(function(){ var c=0; return function(n){ var ans=(c%2==0?n:-n); c++; return ans; } })();