統計字數問題


文章內就不再貼題目了,有需要大家可以直接去OJ上查看—統計字數問題


1. 算法描述

    本題目采用了排列組合的思想。分別計算每個數字在每一位上出現的次數,累加之后,即為最后的結果。
    需要特別注意的是,我們直接用排列組合直接計算,但是並沒有把0 和其他數字分開來算,
    所以這樣計算出來的結果就是把前導0 也一起算進去了,所以輸出結果前應該減掉所有前導0。
    文字說明不夠直觀,下面我舉個栗子來幫助大家理解這個算法

栗子

page:25634

位次 該位上數字 0-9 共同出現的次數 小於該位上數字的數額外加的值 等於該位上的數字的數額外加的值
個位 4 2563 * 1 +1 +1
十位 3 256 * 10 +10 +4
百位 6 25 * 100 +100 +34
千位 5 2 * 1000 +1000 +634
萬位 2 0 * 10000 +10000 +5634

相信大家可以從表格中找到規律,想要動手實現了吧!但是別着急,現在還沒有減去前導0 ,減完以后才能得到正確結果.
下面是前導0 出現次數的規律
仍以 25634為例
范圍 前導0個數
10000+ 0
01000 ~ 09999 9000 * 1
00100 ~ 00999 900 * 2
00010 ~ 00099 90 * 3
00001 ~ 00009 9 * 4
00000 1 * 5


相信規律並不難找到,就不再啰嗦了。


2. 代碼實現

import java.io.IOException;
import java.util.Scanner;

/** * Created by chen_swe on 3/12/16. */

public class Main {

    /** * 計算並累加第[lg(base) - 1] 位(從右向左)各個數字出現的次數 * * @param page 總頁數 * @param base 基數,用來確定當前計算的是哪一位。 * @param num 整形數組,用來存放各個數字出現的次數。 */
    public static void handle(final int page, int base, int[] num) {
        int s = page / (base * 10);
        int l = page % (base * 10);
        int special = l / base;
        l %= base;
        for (int i = 0; i < 10; ++i) {
            num[i] += s * base;
            if (i < special)
                num[i] += base;
            if (i == special)
                num[i] += l + 1;
        }
    }

    /** * 減去前導0的個數 * * @param page 總頁數 * @param num 整形數組,用來存放各個數字出現的次數。 */
    public static void DealWithZero(int page, int[] num) {
        int len = String.valueOf(page).length();
        int tmp = 9 * (int) Math.pow(10, len - 2);
        int number = 1;
        while (tmp != 0) {
            num[0] -= tmp * number;
            tmp /= 10;
            ++number;
        }
        num[0] -= len;
    }

    public static void main(String[] args) throws IOException {
        Scanner cin =new Scanner(System.in);
        final int Page = cin.nextInt();

        int[] num = new int[10];

        int base = 1;
        while (true) {
            handle(Page, base, num);
            base *= 10;
            if (Page / base == 0)
                break;
        }
        DealWithZero(Page, num);

        for (int i : num)
            System.out.println(i);
    }
}

3. 算法分析

時間復雜度 lg(n)


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



統計字數問題 新浪微博長鏈接字數統計問題 一個統計字數的程序 統計史記的字數 統計字數的小程序(1) 單詞字數統計 用 Python 統計高頻字數 關於字數統計 php 統計可讀字數 一個統計字數的程序
 
粤ICP备14056181号  © 2014-2021 ITdaan.com