页码统计/牛客网/Python/解题报告+源代码

来源:互联网 发布:大数据资格认证 编辑:程序博客网 时间:2024/06/05 01:08

题目链接:https://www.nowcoder.com/questionTerminal/3a003cb6a3174ef9835fa603e01d8b52


解法一:暴力法。

从第一页到第n页,逐页统计。

复杂度太高,超时。

# def pageCount ():#     n = input()#     count = [ 0 for i in range(10)]#     n = int(n)###     for i in range(1,n+1):#         curpage = i#         while(curpage > 0):#             curnum = curpage % 10#             curpage = curpage // 10#             count[curnum] += 1##     for i in range(0, 9):#         print(count[i], end = ' ')#     print(count[9])## pageCount()



解法二:找规律。

直接从页数n上计算。比如对于页数**X**,计算数字i(0-9)在第3位上统计相关数字出现的次数:

1)如果数字i比X大,则它在这一位上出现的次数与前面的数字和该数字所在的位置有关。例如,12345中,数字4在第3位出现的次数为:12*100=1200

2)如果数字等于X,则它在这一位上出现的次数与前面的数字、后面的数字和该数字所在的位置有关。例如,12345中,数字3在第3位上出现的次数为:12*100+45+1=1246

3)如果数字小于X,则它在这一位上出现的次数与前面的数字和该数字所在的位置有关。例如,12345中,数字2在百位上出现的次数为12+1)*100=1300


注意!!!如果数字i为0,需要特殊处理!

当i为1-9中一个数时候,比如i为1时:1左边可以有0, 01是成立的。但是对于i=0时候,左边不可以为0.


def pageCount():    n = input()    n = int(n)    count = [0 for i in range(10)]    for i in range(0,10):        page = n        p = 0 #代表当前数字tmp右边还有几个数字        t = 0 #统计出现次数        while(page // (10**(p)) > 0):            tmp = ( page % ( 10 ** (p+1)) ) // (10 ** p)            left = page // ( 10 ** (p+1))            right =  page % ( 10 ** (p))            #print(left,tmp,right)            if( i == 0 ):                left -= 1            if (i > tmp):                t += left*(10**p)            elif (i < tmp):                t += (left+1)*(10**p)            else:                t += ( left*(10**p) + right + 1 )            p += 1        count[i] = t    for i in range(0, 9):         print(count[i], end = ' ')    print(count[9])pageCount()