愚僧

          贏與輸?shù)牟顒e通常是--不放棄

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            23 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks

          有一個(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。


          package web;

          import java.util.Arrays;

          /**
           * 有一個(gè)已經(jīng)排序的數(shù)組(升序), 數(shù)組中可能有正數(shù)、負(fù)數(shù)或0,求數(shù)組中元素的絕對(duì)值最小的數(shù), 要求,不能用順序比較的方法 求絕對(duì)值最小的數(shù)
           * 
           * 
          @author mayw
           
          */
          public class FindMinValue {

              /**
               * 
               * 
          @param source
               *            原數(shù)組
               * 
          @return 絕對(duì)值最小的數(shù)
               * 
          @throws Exception 
               
          */
              public static int[] getMinAbsoluteValue(final int[] source) throws Exception {
                  int[] rvs = null;
                  if(source==null){
                      throw new Exception("非法的原數(shù)組, 對(duì)象為null");
                  }
                  int index = binarySearch(source,0);
                  int insertPos = -1 - index;
                  if(index >= 0){
                      return new int[]{0}; // 存在0, 0絕對(duì)值最小 
                  }else if(source.length==1){
                      return new int[]{source[0]};
                  }else if(insertPos == source.length){
                      return new int[]{source[source.length - 1]};
                  }else if(insertPos == 0){
                      return new int[]{source[0]};
                  }else if(Math.abs(source[insertPos]) > Math.abs(source[insertPos - 1])){
                      return new int[]{source[insertPos - 1]};
                  }else if(Math.abs(source[insertPos]) == Math.abs(source[insertPos - 1])){
                      return new int[]{source[insertPos - 1],source[insertPos],};
                  }else{
                      return new int[]{source[insertPos]};
                  }
          //        int rv = index >= 0 ? 0
          //                : source[insertPos == source.length ? source.length - 1
          //                        : insertPos];
          //        if(){
          //            
          //        }
          //        return index >= 0 ? 0
          //                : source[insertPos == source.length ? source.length - 1
          //                : insertPos];
              }

              /**
               * 使用二分搜索法來(lái)搜索指定的 int 型數(shù)組,以獲得指定的值。
               * 
               * 
          @param source
               *            要查找的目標(biāo)數(shù)組
               * 
          @param target
               *            要查找的數(shù)
               * 
          @return 如果它包含在數(shù)組中,則返回搜索鍵的索引; 否則返回 (-(插入點(diǎn)) - 1)。 插入點(diǎn)
               *         被定義為將鍵插入數(shù)組的那一點(diǎn):即第一個(gè)大于此鍵的元素索引, 如果數(shù)組中的所有元素都小于指定的鍵,則為 a.length。
               *         注意,這保證了當(dāng)且僅當(dāng)此鍵被找到時(shí),返回的值將 >= 0。
               
          */
              public static int binarySearch(final int[] source, int target) {
                  int low = 0;
                  int high = source.length - 1;
                  while(low<=high){
                      int midIdx = (low+high)>>1; // 去中間索引
                      int midVal = source[midIdx]; // 去中間值
                      if(target < midVal){
                          high = midIdx - 1; // 去中間索引的前半部分, 不包含中間索引
                      }else if(target > midVal){
                          low = midIdx + 1; // 去中間索引的后半部分, 不包含中間索引
                      }else{
                          return midIdx; // 返回當(dāng)前索引
                      }
                  }
                  return -low-1;
              }

              public static void main(String[] args) throws Exception {
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{0})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{-1})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{1})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{-4,-2,-1})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{-4,-2,-1,1,2,3,4})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{-4,-2,-1,2,3,4})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{-4,-2,-2,1,3,4})));
                  System.out.println(Arrays.toString(getMinAbsoluteValue(new int[]{1,2,3,4})));
              }

          }


          from : http://www.cnblogs.com/nokiaguy/archive/2013/01/29/2881476.html
          posted on 2013-02-24 20:51 ywm 閱讀(181) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): j2se

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永福县| 青海省| 固原市| 漳浦县| 临城县| 边坝县| 牙克石市| 城口县| 西盟| 靖安县| 安阳县| 涿州市| 翼城县| 萝北县| 兴安盟| 晋城| 峨山| 平果县| 郑州市| 萍乡市| 汪清县| 通道| 利川市| 佳木斯市| 阳高县| 泸溪县| 嘉定区| 黄龙县| 福清市| 囊谦县| 伊春市| 汉源县| 阿尔山市| 华蓥市| 华池县| 东至县| 肇庆市| 八宿县| 个旧市| 吴旗县| 华坪县|