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

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

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

    走在架構(gòu)師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項(xiàng)目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

     原題目:
     給定一個十進(jìn)制數(shù)N,寫下從1開始,到N的所有整數(shù),然后數(shù)一下其中出現(xiàn)的所有"1"的個數(shù)。
     例如:
     N=2,寫下1,2。這樣只出現(xiàn)了1個"1"
     N=12,寫下 1,2,3,4,5,6,7,8,9,10,11,12。這樣"1"的個數(shù)是5
     請寫出一個函數(shù),返回1到N之間出現(xiàn)"1"的個數(shù),比如 f(12)=5

     1package org.blogjava.arithmetic;
     2
     3/**
     4 * @author Jack.Wang
     5 * @see http://jack2007.blogjava.net/
     6 */

     7public class CountNumber {
     8
     9    private int count1Num(int num) {
    10        int sum = 0;
    11        while (num != 0{
    12            sum += (num % 10 == 1? 1 : 0;
    13            num /= 10;
    14        }

    15        return sum;
    16    }

    17
    18    private int countNum(int n) {
    19        int sum = 0;
    20        for (int i = 1; i <= n; i++{
    21            sum += count1Num(i);
    22        }

    23        return sum;
    24    }

    25
    26    private int countNumNew(int n) {
    27        int count = 0;
    28        int factor = 1;
    29        int lower;
    30        int current;
    31        int higher;
    32        while (n / factor != 0{
    33            lower = n - (n / factor) * factor;
    34            current = (n / factor) % 10;
    35            higher = n / (factor * 10);
    36            switch (current) {
    37            case 0:
    38                count += higher * factor;
    39                break;
    40            case 1:
    41                count += higher * factor + lower + 1;
    42                break;
    43            default:
    44                count += (higher + 1* factor;
    45            }

    46            factor *= 10;
    47        }

    48        return count;
    49    }

    50
    51    /**
    52     * @param args
    53     */

    54    public static void main(String[] args) {
    55        System.out.println("兩個算法的結(jié)果相等");
    56        /**
    57         * 方法一: 這個問題看上出并不是一個難問題,因?yàn)椴恍枰嗟乃伎迹灰远c(diǎn)程序的人都會想到,簡單的設(shè)計(jì)如下。
    58         * 這個方法很簡單但是這個算法的致命問題是效率,它的時間復(fù)雜度是 O(N)*count(int num)函數(shù)的復(fù)雜度=
    59         * O(N)*logN。可見如果N很大時復(fù)雜度成線性增長。是否還有更好的方法,我說的是從算法復(fù)雜的角度考慮最優(yōu)的方法? 
                        請看方法二。
    60         */

    61        long start = System.currentTimeMillis();
    62        CountNumber cn1 = new CountNumber();
    63        System.out.println("第一個算法的結(jié)果"+cn1.countNum(100000000));
    64        long end = System.currentTimeMillis();
    65        long time1 = end - start;
    66        /**
    67         * 方法二: 這種方法分別分析N的每一位上1出現(xiàn)的可能性,讀者可以自己按照歸納的思想分析一下,最終你會得出
    68         * 一個結(jié)論,就是通過分析N而不是遍歷1到N的每一個數(shù)就可以得出答案,如果N的長度為Len的話這種 算法的復(fù)雜度為O
                        (Len)。 發(fā)現(xiàn)規(guī)律為
    69         * 1. 如果位數(shù)上為0,1的數(shù)目由該位以上的數(shù)決定,并乘以該位的分位 比如百位上是0,高位上是14則百位上出現(xiàn)1的數(shù)目
                            為 14*100。
    70         * 2. 如果位數(shù)上為1,1的數(shù)目由高位和低位共同決定。 比如高位是14低位是112,則百位出現(xiàn)1的數(shù)目為 14×100+(112+
                            1) 
    71         * 3. 如果位數(shù)上大于1,則百位出現(xiàn)1的數(shù)目為 (14+1)×100
    72         */

    73        start = System.currentTimeMillis();
    74        CountNumber cn2 = new CountNumber();
    75        System.out.println("第二個算法的結(jié)果"+cn2.countNumNew(100000000));
    76        end = System.currentTimeMillis();
    77        long time2 = end - start;
    78        System.out.println("第一個算法的時延比第二個算法的多" + (time1 - time2) / 1000 + "");
    79    }

    80
    81    /**
    82     Console Out:
    83     兩個算法的結(jié)果相等
    84     80000001
    85     80000001
    86     第一個算法的時延比第二個算法的多27秒
    87     */

    88}

    89




    本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。
    posted on 2008-10-16 18:10 Jack.Wang 閱讀(4139) 評論(11)  編輯  收藏 所屬分類: 數(shù)學(xué)&算法

    Feedback

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-16 22:07 testsssss
    N=12,寫下 1,2,3,4,5,6,7,8,9,10,12。這樣"1"的個數(shù)是5??  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-16 22:38 Jack.Wang
    @testsssss
    不好意思打錯了。  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-16 22:43 YYX
    @testsssss
    缺了個11  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 01:14 YYX
    不好意思,我借用你這道題目在cnblogs上發(fā)了一篇blog...  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 10:01 mr.s
    感覺沒什么用啊  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 12:36 Huangyy
    還有一種方法,就是轉(zhuǎn)成String 然后一個一個字符去匹配就OK  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 14:44 Lancelot
    只要將1-N的數(shù)字作為字符串疊加在一起,然后用"1"作為分隔符將字符串分割為數(shù)組,數(shù)組長度減一就是“1的個數(shù)”。  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 14:45 Lancelot
    當(dāng)然要先排除只有一個"1"的情況。  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 17:01 YYX
    @Lancelot
    你大概以為字符串疊加這算法能達(dá)到o(N)復(fù)雜度
    但實(shí)際上這種就是NLogN復(fù)雜度的算法。
    因?yàn)镮nteger向String轉(zhuǎn)換過程中有LogN的復(fù)雜度。
    對每項(xiàng)數(shù)字都轉(zhuǎn)換,那總共就有NLogN的復(fù)雜度。
    如果你還想把數(shù)字都疊一起算,那么你的空間開銷都將由原來的LogN達(dá)到 NLogN  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-17 17:48 lvcha
    def f n
    result=0
    n.times do |i|
    result=result+(i.to_s).count('1')
    end
    return result
    end

    f 12
    12
    f 1200
    640
    當(dāng)然速度是慢,可是工作中在你研究復(fù)雜度時我已經(jīng)完成開發(fā)開始新的模塊了  回復(fù)  更多評論
      

    # re: 微軟面試題---求出1的個數(shù)之小解 2008-10-20 13:44 Reeze
    @lvcha
    這樣很無聊啊~~  回復(fù)  更多評論
      

    主站蜘蛛池模板: 99久久国产精品免费一区二区 | xxxxx做受大片视频免费| 亚洲中文字幕久久精品无码VA| 亚洲欧洲精品视频在线观看| 亚洲精品白色在线发布| 亚洲福利一区二区精品秒拍| 亚洲精品一卡2卡3卡三卡四卡| 亚洲精品mv在线观看| 亚洲一级毛片免费在线观看| 亚洲日本乱码卡2卡3卡新区| 亚洲人成人网站18禁| 亚洲aⅴ无码专区在线观看春色| 亚洲av日韩av永久在线观看 | 亚洲av中文无码乱人伦在线r▽| 国产亚洲福利精品一区| 亚洲av无码不卡一区二区三区| 亚洲午夜视频在线观看| 亚洲精品国产情侣av在线| 国产成人精品日本亚洲直接| 亚洲精品乱码久久久久久V| 高潮内射免费看片| 久久成人18免费网站 | 亚洲性无码AV中文字幕| 国产亚洲精品AAAA片APP| 人妖系列免费网站观看| 久久精品视频免费| 国产精品久久免费| 在线看片无码永久免费aⅴ | 久草视频免费在线观看| 日韩成人在线免费视频 | 久久国产精品成人片免费| 无码人妻精品中文字幕免费东京热| 久久笫一福利免费导航| 免费a级毛片18以上观看精品| 亚洲真人无码永久在线| 亚洲精品第一国产综合精品 | 亚洲妇熟XXXX妇色黄 | 亚洲福利在线播放| 亚洲人成电影在在线观看网色| 亚洲AV无码专区在线亚| 人人爽人人爽人人片av免费|