https://lina.bitcron.com/post/code/2018-summer-fb-intern-mian-jing
给一个Interfacedouble I(double x) => 就是表示一个non-decreasing的函数曲线,给横坐标返回纵坐标实现 double findX(double min,double max, double y) =>给一个范围,和纵坐标返回对应的最接近的横坐标。补充条件: 最小精度E已知, 因为面试官说考虑输入正无穷到负无穷,无穷到Double.MAX_VALUE 和Double.MIN_VALUE之间的反函数f()已知,这里看起来怪怪的看代码就知道了。这道题我觉得是考官自己编的,所以一边写一边讨论条件。我不是很了解double,面试官说有正负无穷,以及面试官和我达成的共识Double.min/max是可以作为real number处理的边界。
double findX(double min,double max, double y){ if(min<Double.MIN_VALUE&&y<I(Double.MIN_VALUE)){ return f(min); } if(max>Double.MAX_VALAUE&&y>I(Double.MAX_VALUE)){ return f(max); } double lo = Math.max(min,Double.MIN_VALUE), hi = Math.min(max,Double.MAX_VALUE); while(lo<=hi){ double mid = (hi - lo)/2.0 + lo; if(I(mid)==y) return mid; else if(I(mid)<y) lo = mid+E; else hi = mid - E; } return lo; }