隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          百度面試題:求絕對值最小的數

              有一個已經排序的數組(升序),數組中可能有正數、負數或0,求數組中元素的絕對值最小的數,要求,不能用順序比較的方法(復雜度需要小于O(n)),可以使用任何語言實現

          例如,數組{-20,-13,-4, 6, 77,200} ,絕對值最小的是-4。

           

              算法實現的基本思路

          找到負數和正數的分界點,如果正好是0就是它了,如果是正數,再和左面相鄰的負數絕對值比較,如果是負數,取取絕對值與右面正數比較。還要考慮數組只有正數或負數的情況。

          我根據這個思路用Java簡單實現了一個算法。大家有更好的實現方法歡迎跟帖

          public class MinAbsoluteValue
          {
              
          private static int getMinAbsoluteValue(int[] source)
              {
                   
                  
          int index = 0;
                  
          int result = 0
                  
          int startIndex = 0;
                  
          int endIndex = source.length - 1;
                  
          //  計算負數和正數分界點
                  while(true)
                  {
                          //  計算當前的索引
                      index = startIndex + (endIndex - startIndex) / 2;
                      result 
          = source[index];<br>                //  如果等于0,就直接返回了,0肯定是絕對值最小的
                      if(result==0)
                      {
                          
          return 0;
                      }
                         //  如果值大于0,處理當前位置左側區域,因為負數肯定在左側
                      else if(result > 0)
                      {
                          
          if(index == 0)
                          {
                              
          break;
                          }
                          
          if(source[index-1>0)
                              endIndex 
          = index - 1;
                          
          else if(source[index-1==0)
                              
          return 0;
                          
          else
                              
          break;
                      }
                      //  如果小于0,處理當前位置右側的區域,因為正數肯定在右側的位置
                      else
                      {
                          
          if(index == endIndex)
                              
          break;
                          
          if(source[index + 1< 0)
                              startIndex 
          = index + 1;
                          
          else if(source[index + 1== 0)
                              
          return 0;
                          
          else
                              
          break;
                      }
                  }
                  
          //  根據分界點計算絕對值最小的數
                  if(source[index] > 0)
                  {
                      
          if(index == 0 || source[index] < Math.abs(source[index-1]))
                          result
          = source[index];
                      
          else
                          result 
          = source[index-1];
                  }
                  
          else
                  {
                      
          if(index == source.length - 1 || Math.abs(source[index]) < source[index+1])
                          result
          = source[index];
                      
          else
                          result 
          = source[index+1];
                  }
                   
                   
                  
          return result;
              }
              
          public static void main(String[] args) throws Exception
              {
                   
                  
          int[] arr1 = new int[]{-23,-22,-3,-2,1,2,3,5,20,120};
                  
          int[] arr2 = new int[]{-23,-22,-12,-6,-4};
                  
          int[] arr3 = new int[]{1,22,33,55,66,333};
                  
          int value = getMinAbsoluteValue(arr1);
                  System.out.println(value);
                  value 
          = getMinAbsoluteValue(arr2);
                  System.out.println(value);
                  value 
          = getMinAbsoluteValue(arr3);
                  System.out.println(value);
              }
          }




          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2013-01-30 11:45 銀河使者 閱讀(12128) 評論(10)  編輯  收藏 所屬分類: algorithm 原創 圖書

          評論

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          這個很明顯二分
          2013-01-30 17:42 | cintana

          # re: 百度面試題:求絕對值最小的數[未登錄]  回復  更多評論   

          有序列表查找顯然二分啊,博主貌似對java的arrays和collections不是很熟。
          private static int getMinAbsoluteValue(final int[] source) {
          int index = Arrays.binarySearch(source, 0);
          int insertPos = -1 - index;
          return index >= 0 ? 0
          : source[insertPos == source.length ? source.length - 1
          : insertPos];
          }
          2013-01-30 23:48 | changedi

          # re: 百度面試題:求絕對值最小的數[未登錄]  回復  更多評論   

          object FindMinimum {
          def main(args: Array[String]): Unit = {
          val l = List(-20, -13, -4, 6, 77, 200)
          val l2 = List(-30,-20,-20,-2)
          val l3 = List(1,2,3,4,5)

          def cal(list: List[Int]): Int = {
          import Math._
          list match {
          case List(a) => a
          case List(a, b) => min(abs(a), abs(b))
          case List(a, b, c) => min(abs(c), min(abs(a), abs(b)))
          case l =>
          val len = l.length / 2
          val ploc = l(len)
          val ppre = l(len-1)
          val loc = abs(ploc)
          val pre = abs(ppre)
          if ((ploc > ppre) && (loc > pre)) cal(l.take(len))
          else cal(l.takeRight(len))
          }
          }
          println(cal(l))
          println(cal(l2))
          println(cal(l3))

          }
          }
          2013-01-31 11:05 | harry

          # re: 百度面試題:求絕對值最小的數[未登錄]  回復  更多評論   

          written in Scala
          object FindMinimum {
          def main(args: Array[String]): Unit = {
          val l = List(-20, -13, -4, 6, 77, 200)
          val l2 = List(-30,-20,-10,-2)
          val l3 = List(1,2,3,4,5)

          def cal(list: List[Int]): Int = {
          import Math._
          list match {
          case List(a) => a
          case l =>
          val len = l.length / 2
          val ploc = l(len)
          val ppre = l(len-1)
          val loc = abs(ploc)
          val pre = abs(ppre)
          println(loc,pre)
          if ((ploc > ppre) && (loc > pre)) cal(l.take(len))
          else cal(l.takeRight(len))
          }
          }
          println(cal(l))
          println(cal(l2))
          println(cal(l3))
          }
          }
          2013-01-31 11:26 | harry

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          @changedi

          算法還有點問題,如果數組是{-20, -13, -4, 4, 77, 200},你的算法就只能求出一個值。當index < 0時,還應該比較下插入點附近的兩個值
          2013-02-24 18:50 | dohkoos

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          百度的面試題真夠難的啊。。。。
          2013-07-09 14:37 | txt小說下載

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          算法啊,我算是真的搞不來這東西……
          2013-12-28 15:49 | 左岸

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          #include <iostream>
          #include <cmath>
          #include <vector>

          using namespace std;

          int minabs(vector<int> &a, int start, int end){
          if(start+1 == end){
          return a[start];
          }else if(start+2 == end){
          return abs(a[start]) < abs(a[start+1]) ? a[start] : a[start+1];
          }else if(a[start] * a[end-1] > 0){
          return abs(a[start]) < abs(a[end-1]) ? a[start] : a[end-1];
          }else{
          int middle = (start+end)/2;
          int leftmin = minabs(a, start, middle);
          int rightmin = minabs(a,middle, end);
          return abs(leftmin)< abs(rightmin)?leftmin:rightmin;
          }
          }

          int main(){
          vector<int> array;
          int buf = 0;
          while(cin>>buf){
          array.push_back(buf);
          }
          cout << minabs(array, 0, array.size()) << endl;
          }


          2014-03-11 00:00 | jiuren

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          查博主的資料看到,挺有意思的,采用二分法
          int getSmallestAbsolute(int[] elements, int low, int high){
          if(low == high)
          return elements[low];
          if(elements[low] >= 0)
          return elements[low];
          if(elements[high] <= 0)
          return elements[high];
          int mid = (low + high)/2;
          return Math.min(getSmallestAbsolute(elements, low, mid),
          getSmallestAbsolute(elements, mid+1, high));
          }
          2014-06-09 18:17 | 嗯Jeffrey

          # re: 百度面試題:求絕對值最小的數  回復  更多評論   

          http://www.ma4.net
          2014-08-30 11:16 | 微觀互聯網
          主站蜘蛛池模板: 高密市| 正镶白旗| 庐江县| 安宁市| 贵州省| 兴业县| 赤水市| 乌海市| 乡城县| 拜泉县| 陆河县| 长子县| 永善县| 高邮市| 湖南省| 保定市| 宜兴市| 鹤岗市| 靖州| 铜鼓县| 塘沽区| 娄底市| 平武县| 饶平县| 秭归县| 黄冈市| 江城| 台北市| 兴安县| 邹城市| 惠安县| 哈尔滨市| 潼南县| 江西省| 越西县| 洮南市| 郁南县| 九寨沟县| 仁寿县| 杭锦后旗| 上饶县|