<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 銀河使者 閱讀(12118) 評論(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 | 微觀互聯網
    主站蜘蛛池模板: 亚洲熟女乱综合一区二区| 国产精品亚洲lv粉色| 亚洲精品麻豆av| 曰批全过程免费视频免费看| 亚洲av一综合av一区| 免费A级毛片无码A∨男男| 国产精品久久久久免费a∨| 97超高清在线观看免费视频| 在线观看亚洲免费| 亚洲一区二区三区播放在线| 久久久无码精品亚洲日韩蜜桃 | 日本免费人成在线网站| 国产在线国偷精品免费看| 国产亚洲福利一区二区免费看| 亚洲成a人片在线网站| 久久亚洲国产精品五月天| 亚洲综合伊人久久综合| 免费人成在线观看网站视频| 好吊妞在线成人免费| 2021久久精品免费观看| 2015日韩永久免费视频播放 | 久久国产成人亚洲精品影院| 免费理论片51人人看电影| 美女视频黄是免费的网址| 久久久受www免费人成| 亚洲夂夂婷婷色拍WW47| 亚洲人妖女同在线播放| 亚洲视频免费在线看| 91亚洲一区二区在线观看不卡| 国产亚洲欧洲精品| 国产亚洲精品无码成人| 久久久久亚洲爆乳少妇无 | 亚洲欧美日韩中文无线码| 亚洲av产在线精品亚洲第一站 | 免费国产成人α片| 暖暖免费日本在线中文| 色欲国产麻豆一精品一AV一免费 | 亚洲精品无码久久久久sm| 亚洲线精品一区二区三区影音先锋| 亚洲日本va午夜中文字幕久久| 亚洲国产激情一区二区三区|