`

一道面试题,设计函数f(f(n))=-n

 
阅读更多

  题目是这样的:请设计一个函数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;

 }

})();

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics