寶寶參加了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 分行交互輸入