成都创新互联网站制作重庆分公司

Java怎么计算1到n整数中1出现的次数

本篇内容介绍了“Java怎么计算1到n整数中1出现的次数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

成都创新互联公司专注于甘谷网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供甘谷营销型网站建设,甘谷网站制作、甘谷网页设计、甘谷网站官网定制、重庆小程序开发公司服务,打造甘谷网络公司原创品牌,更为您提供甘谷网站排名全网营销落地服务。

题目介绍

求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

解题思路

方法一:递归每个数字

思路

思路很简单,写个for循环,从1到n,在循环体中判断这个数包含了多少个1

复杂度O(nlogn),面试官不怎么开心呢。。 

方法二:找规律 

思路

设N = abcde,其中abcde分别为十进制中各位上的数字。

如果要计算百位上1出现的次数,它要受到3方面的影响:百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。

①如果百位上数字为0,百位上可能出现1的次数由更高位决定。比如:12013,则可以知道百位出现1的情况可能是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,…,11100 ~ 11199,一共1200个。可以看出是由更高位数字(12)决定,并且等于更高位数字(12)乘以 当前位数(100)。

② 如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响。比如:12113,则可以知道百位受高位影响出现的情况是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,….,11100 ~ 11199,一共1200个。和上面情况一样,并且等于更高位数字(12)乘以当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。

③ 如果百位上数字大于1(2 ~ 9),则百位上出现1的情况仅由更高位决定,比如12213,则百位出现1的情况是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,…,11100 ~ 11199,12100 ~ 12199,一共有1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。 

代码

public int NumberOf1Between1AndN_Solution(int n) {

    //1的个数
    int count = 0;

    //当前位
    int i = 1;

    int current, after, before;

    while((n/i)!= 0){

        //高位数字
        current = (n/i)%10;
        //当前位数字
        before = n/(i*10);
        //低位数字
        after = n-(n/i)*i;

        //如果为0,出现1的次数由高位决定,数量等于高位数字 * 当前位数
        if (current == 0) {
            count += before * i;
        } else if(current == 1) {
            //如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1
            count += before * i + after + 1;
        } else{
            //如果大于1,出现1的次数由高位决定,(高位数字+1)* 当前位数
            count += (before + 1) * i;
        }
        //前移一位
        i = i*10;
    }
    return count;
}

“Java怎么计算1到n整数中1出现的次数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


网页题目:Java怎么计算1到n整数中1出现的次数
分享地址:http://cxhlcq.com/article/pdhpgc.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部