美团点评2018春招自然语言处理方向

宝宝参加了2018美团的线上笔试,现改编题目一道:
这里写图片描述

美团编程题目简化版

小猪佩奇在探寻数字的奥秘,想要知道1到n的正整数排列起来一共有多少位数字。

例如:n为11的时候,1234567891011,一共13位,则输出13。n的的大小范围是1<=n<=10^9。
题目改编自:美团点评2018春招 自然语言处理方向职位试卷,

  • 题目改编自:美团点评2018春招自然语言处理方向职位试卷。原题在第二部分美团编程题目原题版。
  • 训练类型: python 交互输入、编程逻辑
  • Python环境:python3.5
  • 训练时长:20 min

    简化版代码展示
## 此函数求each是几位数,
def weishu(each):
    a=1
    each1= int(each)
    if each1 > 9: ##首先判断是不是个位数
        for i in range(9): ##题目规定输入数字不超过10的9次方
           each1 = each1 // 10 #通过商是否大于1(是否是10的倍数),累计位数
           if each1 >0: 
               a=a+1
           else:
               break
    return a
## 此函数计算数字nEach,对应的排列123……nEach总共的位数 
def numsEach(nEach):
    a = weishu(nEach)
    ## b可代表n大于10的最大次方数 ,eg;521,a=3.b=2
b=a-1  
    nums = 0
    if b <=0:
        nums= nEach #个位数的情况
    else:
        for i in range(b): # per部分
            nums = nums+ 9*pow(10,i)*(i+1)
        remainder = nEach-(pow(10,b)-1)
        remainderNums = (remainder)*a #remainder部分
        nums =nums+ remainderNums
    return nums
if __name__ == '__main__':
    Tstr = input("输入数据:")
    T = int(Tstr)
    print(“排列后总位数为:”numsEach(T))

思路介绍

  • 第一步: 想一想数字n,是一位数、两位数……的情况
  • 第二步:思考编程逻辑,如果n为个位数,那1234……9,这几个数排列的的位数就是本身的数值大小;如果n不是个位数,eg:
    n=123,将n分割为两部分(per部分、remainder部分)。
    1到9,10到99(per部分),100到123(remainder部分,remainder包含数字个数为24),其中1至9有9个一位数,10至99,有90个两位数……。1到123排列起来,总位数就是9*1+9*10*2+remainder*3。思考为什么这样分割。

  • 第三步:设计具体结构,把目标分解,目标一求n是几位数,目标二将n分割为(per部分)(remainder部分),并求两部分数字排列起来的总位数。

  • 提示:python3 /是精确除法,//是向下取整除法,%是求模(余),pow(a,b)得到a^b次方

原题面面看

美团笔试原题的输入方式是:
第一行一个数T(T<=100),表示数据组数。
对于每组数据,每一行1个整数n(1<=n<=10^9)
输出:
对于每组数据,输出一行,表示数字位数和。
样例输入:
2
11
4
样例输出:
13
4

非常重要:

观察输入结构,数据是按行排列,每一行一个数据。思考如何编程,才能让数据排列如题要求。这种交互输入方式(Python多行输入),是阿里、美团等面试编程题经常会遇到的。

针对美团输入输出要求对上面代码增加两个函数,:

1获取输入函数getDate 2,输出函数,并对main函数简单改造

def weishu(each):
见上代码
def numsEach(nEach):
见上代码
##此函数获取输入
def getData():
    Tstr = input("输入所计算数据的组数(T):")
    T = int(Tstr)
    h=[]
    print("请以enter为换行符,输入要计算的数据,每一行一个共T个" )
    for i in range(T):
        inputLine = input()  # 以字符串的形式读入一行
        listLine = inputLine.split(' ')  # 以空格划分就是序列的形式了
        listLine = [int(e) for e in listLine]  # 将序列里的数由字符串变为int类型
        h.append(listLine)
        # inputLine = input()
return T,h
##此函数计算所有数据并输出
def numAll(T,h):
    num=[]
    for i in range(int(T)):
        for j in range(len(h[i])):
            a = int(h[i][j])
            num= numsEach(a)
            print(num),
    return num
if __name__ == '__main__':
    T, h=getData()
    numAll(T, h)

需要get的技能:

Python 分行交互输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值