javascript:求絕對值最小的數

問題來源:http://androidguy.blog.51cto.com/974126/1129543
有一個已經排序的數組(升序),數組中可能有正數、負數或0,求數組中元素的絕對值最小的數,要求,不能用順序比較的方法(複雜度需要小於O(n)),可以使用任何語言實現例如,數組{-20,-13,-4, 6, 77,200} ,絕對值最小的是-4。

問題分解:

第一步:二分法尋找改變符號的位置(0視爲正數)

第二步:比較位置左右數字的絕對值大小,取較小的那一個

  1. <script language="javascript">  
  2. var getBound = function(a,fr,to){  
  3.     //[fr,to]是候選位置區間,位置從0開始計數  
  4.     var b=fr,f=fr,t=to,s=true;  
  5.     var left=function(b){return a[b-1];};//獲取該位置右邊的數字,增加代碼可讀性  
  6.     var right=function(b){return a[b];};//獲取該位置左邊的數字,增加代碼可讀性  
  7.     if(a.length===0){  
  8.         return -1;//數組爲空,返回-1  
  9.     }else{  
  10.         if(right(b)>=0){  
  11.             s=false;//初始化位置就是要找的位置  
  12.         }else{  
  13.             for(var i=1;i<=100 && s;i++){  
  14.                 b=f+Math.ceil((t-f)/2);//找到中點  
  15.                 if(right(b)===undefined||(left(b)<0 && right(b)>=0)){  
  16.                     s=false;//中點就是要找的位置  
  17.                 }else if(right(b)<0){  
  18.                     f=b;//下次前進找中點  
  19.                 }else{  
  20.                     t=b;//下次後退找中點  
  21.                 }  
  22.             }  
  23.         }  
  24.         return b;  
  25.     }  
  26. };  
  27. var getMinAbs = function(a){  
  28.     var b=getBound(a,0,a.length);//獲取位置  
  29.     if(b>=0){  
  30.         if(b===0){  
  31.             return Math.abs(a[b]);//位置在最左邊  
  32.         }else if(b===a.length){  
  33.             return Math.abs(a[b-1]);//位置在最右邊  
  34.         }else{  
  35.             return (Math.abs(a[b])>Math.abs(a[b-1])?Math.abs(a[b-1]):Math.abs(a[b]));//位置在中間  
  36.         }  
  37.     }else{  
  38.         return false;  
  39.     }  
  40. };  
  41.  
  42. //測試代碼  
  43. var myArray=[-20,-13,-4,0,0,0,6,77,200,201,202];  
  44. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  45. var myArray=[];  
  46. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  47. var myArray=[-1];  
  48. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  49. var myArray=[1];  
  50. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  51. var myArray=[0,0];  
  52. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  53. var myArray=[-1,-1];  
  54. alert("[" + myArray + "]: " + getMinAbs(myArray));  
  55. </script> 

 以myArray=[-20,-13,-4,0,0,0,6,77,200,201,202]爲例,測試彈出:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章