从1到n整数中1出现的次数

来源:互联网 发布:linux tomcat启动太慢 编辑:程序博客网 时间:2024/04/30 08:21

题目:

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数,例如输入12,则从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。

解法一:编程之美中给出的解法如下

public class Solution {    public int NumberOf1Between1AndN_Solution(int n) {            /**编程之美上给出的规律:1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字X当前位数的权重10i-1。2. 如果第i位上的数字为1,则第i位上可能出现1的次数不仅受更高位影响,还受低位影响(若没有低位,视低位为0),等于更高位数字X当前位数的权重10i-1+(低位数字+1)。3. 如果第i位上的数字大于1,则第i位上可能出现1的次数仅由更高位决定(若没有高位,视高位为0),等于(更高位数字+1)X当前位数的权重10i-1。         */       if(n<1) return 0;       int result=0,temp=n,base=1;       while(n>0){           if(n%10==0){//由高位决定               result+=n/10*Math.pow(10, base-1);           }else if(n%10==1){               result+=n/10*Math.pow(10, base-1)+1+temp%Math.pow(10, base-1);           }else{               result+=(n/10+1)*Math.pow(10, base-1);           }           base++;           n=n/10;         }       return result;    }}

解法二:以空间换时间

import java.util.HashMap;public class Solution {    public int NumberOf1Between1AndN_Solution(int n) {        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();        int re = 0;        for (int i = 0; i <= n; i++) {            re += get(i, map);        }        return re;    }    int get(int num, HashMap<Integer, Integer> map) {        if (num == 1) {            return 1;        }        if (num <= 9) {            return 0;        }        Integer re = map.get(num);        if (re == null) {            int t = num % 10;            re = get(t, map) + get(num / 10, map);            map.put(num, re);        }        return re;    }}
1 0
原创粉丝点击