美團點評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 分行交互輸入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章