隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          百度面試題:求絕對(duì)值最小的數(shù)

              有一個(gè)已經(jīng)排序的數(shù)組(升序),數(shù)組中可能有正數(shù)、負(fù)數(shù)或0,求數(shù)組中元素的絕對(duì)值最小的數(shù),要求,不能用順序比較的方法(復(fù)雜度需要小于O(n)),可以使用任何語(yǔ)言實(shí)現(xiàn)

          例如,數(shù)組{-20,-13,-4, 6, 77,200} ,絕對(duì)值最小的是-4。

           

              算法實(shí)現(xiàn)的基本思路

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

          我根據(jù)這個(gè)思路用Java簡(jiǎn)單實(shí)現(xiàn)了一個(gè)算法。大家有更好的實(shí)現(xiàn)方法歡迎跟帖

          public class MinAbsoluteValue
          {
              
          private static int getMinAbsoluteValue(int[] source)
              {
                   
                  
          int index = 0;
                  
          int result = 0
                  
          int startIndex = 0;
                  
          int endIndex = source.length - 1;
                  
          //  計(jì)算負(fù)數(shù)和正數(shù)分界點(diǎn)
                  while(true)
                  {
                          //  計(jì)算當(dāng)前的索引
                      index = startIndex + (endIndex - startIndex) / 2;
                      result 
          = source[index];<br>                //  如果等于0,就直接返回了,0肯定是絕對(duì)值最小的
                      if(result==0)
                      {
                          
          return 0;
                      }
                         //  如果值大于0,處理當(dāng)前位置左側(cè)區(qū)域,因?yàn)樨?fù)數(shù)肯定在左側(cè)
                      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,處理當(dāng)前位置右側(cè)的區(qū)域,因?yàn)檎龜?shù)肯定在右側(cè)的位置
                      else
                      {
                          
          if(index == endIndex)
                              
          break;
                          
          if(source[index + 1< 0)
                              startIndex 
          = index + 1;
                          
          else if(source[index + 1== 0)
                              
          return 0;
                          
          else
                              
          break;
                      }
                  }
                  
          //  根據(jù)分界點(diǎn)計(jì)算絕對(duì)值最小的數(shù)
                  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開(kāi)發(fā)完全講義(第2版)(本書(shū)版權(quán)已輸出到臺(tái)灣)

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



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


          新浪微博:http://t.sina.com.cn/androidguy   昵稱(chēng):李寧_Lining

          posted on 2013-01-30 11:45 銀河使者 閱讀(12128) 評(píng)論(10)  編輯  收藏 所屬分類(lèi): algorithm 原創(chuàng) 圖書(shū)

          評(píng)論

          # re: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

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

          # re: 百度面試題:求絕對(duì)值最小的數(shù)[未登錄](méi)  回復(fù)  更多評(píng)論   

          有序列表查找顯然二分啊,博主貌似對(duì)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: 百度面試題:求絕對(duì)值最小的數(shù)[未登錄](méi)  回復(fù)  更多評(píng)論   

          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: 百度面試題:求絕對(duì)值最小的數(shù)[未登錄](méi)  回復(fù)  更多評(píng)論   

          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: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

          @changedi

          算法還有點(diǎn)問(wèn)題,如果數(shù)組是{-20, -13, -4, 4, 77, 200},你的算法就只能求出一個(gè)值。當(dāng)index < 0時(shí),還應(yīng)該比較下插入點(diǎn)附近的兩個(gè)值
          2013-02-24 18:50 | dohkoos

          # re: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

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

          # re: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

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

          # re: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

          #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: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

          查博主的資料看到,挺有意思的,采用二分法
          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: 百度面試題:求絕對(duì)值最小的數(shù)  回復(fù)  更多評(píng)論   

          http://www.ma4.net
          2014-08-30 11:16 | 微觀互聯(lián)網(wǎng)
          主站蜘蛛池模板: 盐边县| 秦安县| 湟源县| 柳林县| 贡山| 平远县| 屏山县| 滨海县| 恩平市| 屏东市| 宁城县| 克东县| 潜山县| 济南市| 邳州市| 和顺县| 玉门市| 墨竹工卡县| 介休市| 秀山| 饶阳县| 三都| 东平县| 鹿泉市| 璧山县| 南靖县| 琼中| 旌德县| 雅江县| 唐山市| 中牟县| 富蕴县| 西充县| 玉屏| 宜兴市| 胶南市| 邓州市| 天峨县| 佛坪县| 蒲城县| 陆良县|