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

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

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

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

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

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

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

     

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

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

    我根據(jù)這個(gè)思路用Java簡單實(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肯定是絕對值最小的
                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ì)算絕對值最小的數(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開發(fā)完全講義(第2版)(本書版權(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   昵稱:李寧_Lining

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

    評(píng)論

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

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

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

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

    @changedi

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

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

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

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

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

    http://www.ma4.net
    2014-08-30 11:16 | 微觀互聯(lián)網(wǎng)
    主站蜘蛛池模板: 亚洲经典在线观看| 亚洲gv猛男gv无码男同短文| 亚洲成人免费网站| 午夜老司机永久免费看片| 亚洲精品成人av在线| 久久国产精品成人片免费| 亚洲国产午夜电影在线入口| 一本岛高清v不卡免费一三区| 亚洲综合校园春色| 国产美女精品视频免费观看| 国产AV日韩A∨亚洲AV电影| 亚洲熟伦熟女新五十路熟妇| 99久久免费国产特黄| 日本久久久久亚洲中字幕| 国产免费一区二区三区| 亚洲国产成人综合精品| 亚洲成?v人片天堂网无码| 久久九九免费高清视频| 亚洲最大的成网4438| 99久久综合国产精品免费| 亚洲av日韩综合一区二区三区| 国产亚洲精品免费| 两个人日本WWW免费版| 亚洲欧洲校园自拍都市| 在线a毛片免费视频观看| 一边摸一边桶一边脱免费视频| 亚洲国产成人高清在线观看| 免费观看黄色的网站| 爱情岛论坛免费视频| 亚洲AV成人一区二区三区AV| 麻豆国产入口在线观看免费| 成在人线av无码免费高潮水| 亚洲国产亚洲综合在线尤物| 亚洲视频在线精品| 又黄又爽又成人免费视频| 一个人看的www免费在线视频| 久久亚洲AV成人无码国产| 日韩在线天堂免费观看| 久久久高清日本道免费观看| 亚洲乱亚洲乱妇无码| 亚洲AV成人无码久久精品老人|