宝宝参加了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 分行交互输入