劍指Offer之從1到n整數中1出現的次數

題目描述

  求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?爲此他特別數了一下1~13中包含1的數字有一、十、十一、十二、13所以共出現6次,可是對於後面問題他就沒轍了。ACMer但願大家幫幫他,並把問題更加廣泛化,能夠很快的求出任意非負整數區間中1出現的次數。java

基本思路

  當計算右數第$i$位包含的1個數時,一、取第$i$左邊(高位)的數字,乘以$10^{i-1}$,獲得基礎數值a;二、取第$i$位數字計算修正值:算法

  1. 若是大於1,則結果爲a+$10^{i-1}$
  2. 若是小於1,則結果爲a
  3. 若是等於1,則取第$i$位右邊(低位)的數字設爲b,則結果爲a+b+1

此算法的時間複雜度爲$O(log_{10}n)$spa

Java代碼

package com.swordOffer.numberOfOne23; import java.util.Scanner; /** * Created by Feng on 2017/5/27. * 求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數? * 爲此他特別數了一下1~13中包含1的數字有一、十、十一、十二、13 * 所以共出現6次,可是對於後面問題他就沒轍了。 * ACMer但願大家幫幫他,並把問題更加廣泛化,能夠很快的求出任意非負整數區間中1出現的次數。 */
public class NumberOfOne { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int inputNum = sc.nextInt(); int result = numberOfOne(inputNum); System.out.println(result); } } private static int numberOfOne(int inputNum) { //統計1的個數
        int count = 0; //表示當前數字
        int curNum = 0; //表示低位
        int lowNum = 0; //表示高位
        int highNum = 0; //表示因子
        int factor = 1; while (inputNum / factor != 0) { // 12345對10取餘,至關於將當前數置爲個位
            curNum = (inputNum / factor) % 10; lowNum = inputNum % factor; highNum = inputNum / (factor * 10); //若是爲0,出現1的次數由高位決定,等於高位數字 * 當前位數
            if (curNum == 0) { //表示10,101的狀況
                count += factor * highNum; } else if (curNum == 1) { //若是爲1,出現1的次數由高位和低位決定,高位*當前位+低位+1
                count += factor * highNum + lowNum + 1; } else { //若是大於1,出現1的次數由高位決定, //高位數字+1* 當前位數
                count += factor * (highNum + 1); } factor *= 10; } return count; } }
相關文章
相關標籤/搜索