1. 程式人生 > >2018年秋招阿里的筆試程式設計題

2018年秋招阿里的筆試程式設計題

題目1

    只需開口說話就能控制計算機做自己想做的事情,這種新奇的人機互動方式已經從科幻小說進入了現實世界。那麼機器是如何理解人說的話呢?這是一個複雜的過程,其中一個重要的任務就是教會機器理解話語中的重點,即關鍵詞。比如對機器人說“請播放周杰倫的青花瓷”,機器要理解”周杰倫”是一位歌手,而“青花瓷”是一首歌曲。而我們知道,“周杰”也是一位歌手,那機器如何抉擇呢?為了簡化問題,我們使用從左到右的最大長度匹配的原則:在本句裡面,“周杰”的字串長度比“周杰倫”小,所以識別“周杰倫”為歌手。
    通過網際網路,我們能收集到一個龐大的知識庫,幫助我們教機器來做這件事情。知識庫中的所有歌曲的列表,所有歌手的列表,以及其他各種實體的列表。那麼怎麼使用這些實體通過上面的規則來教會機器是識別關鍵詞呢?

編譯說明

編譯器版本python2.7.6

 請使用標準輸出(sys.stout);已禁用圖形、檔案、網路、系統相關的操作,如Process,httplib,os;縮排可以使用tab、4個空格或2個空格,但是隻能任選一種,不可混用。如果使用sys.readline,因為預設會帶換行符,所以要strip(”)進行擷取,建議使用raw_input()
時間限制:3s(c/c++以外語言:5s) 記憶體限制:128M(c/c++以外的語言為:640M)

輸入:

輸入資料包含兩行,
  第一行,實體列表,多種實體之間用分號分隔開,實體名和實體值之間用下劃線隔開,多個實體值之間用豎線隔開,所有標點都是英文狀態下的,格式如下:
  實體名稱1_實體值1|實體值2|…;實體名稱2_實體值1|實體值2|…;….
  第二行:使用者的自然語言指令

輸入範例:

  singer_周杰|周杰倫|劉德華|王力巨集;song_冰雨|北京歡迎你|七里香;actor_周杰倫|孫儷
  請播放周杰倫的七里香給我聽

輸出範例

請播放 周杰倫/actor,singer 的 七里香/song 給我聽

  筆者在看到這一題時,一時興起,邊看綜藝邊敲程式碼,但對演算法的瞭解甚少,只能按照自己的思路來解答,不成熟和不好之處,還望來者給予點評。望各位來者可以與筆者在評論區討論這個問題,可以共同學習

思路:

  輸出範例的句子,在實體值處截斷並以’ ‘聯接,因此,以實體值為切分的字串,將使用者輸入的自然語言切分,並插入輸入範例第一行中的實體名稱。如此,筆者整理思路如下:
  step1:將輸入的第一行按實體名稱和實體值進行切分,並記為字典的形式:如{‘singer’:[‘周杰’,’周杰倫’,’劉德’華],’sng’:[冰雨’,’北京歡迎你’,’七里香’],’actor’:[‘周杰倫’,’孫儷’]
  ste2:判斷上述字典中的value值是否存在於使用者輸入的自然語言裡面,記錄出現在使用者輸入的自然語言實體名稱和實體值,並將具體相同的實體值對應的實體名稱放在一起,如:{‘singer,actor’:’周杰倫‘,’song‘:’七里香’}
  step3:根據step2中的字典,用其value值切分使用者輸入的自然語言,並插入實體名稱。

程式程式碼如下(程式碼版本python3,如註釋處,修改一處即可適應於python2)

# encoding:utf-8
""" author:someone
    編譯版本:python3
"""

def getDict():
    a = input('請輸入規則:') # python2用raw_input("請輸入規則:"),其它地方可不用修改
    b = input('請輸入語句:')
    a1 = a.split(';')
    a2 = [each.split('_') for each in a1]
    a3, b1, b2 = {}, {}, {}
    for each0 in a2:
        a3[each0[0]] = each0[1].split('|')
    for each1 in a3.keys():
        b21 = []
        for each11 in a3[each1]:
            if each11 in b:
                b21.append(each11)
        if len(b21) > 1:
            b3 = [len(each2) for each2 in b21]
            b4 = b3.index(max(b3))
            b1[each1] = b21[b4]
        elif len(b21)==1:
            b1[each1] = b21[0]
        else:
            pass
    list_a = list(b1.keys())
    for i in range(0, len(list_a)):
        if list_a[i] in ''.join(b2.keys()):
            pass
        else:
            a0 = b1[list_a[i]]
            z0 = list_a[i]
            for j in range(i + 1, len(list_a)):
                b0 = b1[list_a[j]]
                if a0 == b0:
                    z0 = z0 + ',' + list_a[j]
            b2[z0] = a0
    return b2,b

def get():
    import time
    time1 = time.time()
    b2,b = getDict()
    list_b = list(b2.keys())
    b01 = b.split(b2[list_b[0]])
    j0 = 1
    for i0 in range(0,len(b01)-1):
        b01.insert(i0+j0,b2[list_b[0]]+'/'+list_b[0])
    if len(list_b)>1:
        for i1 in range(1,len(list_b)):
            b02 = []
            for each in b01:
                if b2[list_b[i1]] in each:
                    m = len(b02)
                    j = 0
                    b02.extend(each.split(b2[list_b[i1]]))
                    for i2 in range(m+1,len(b02)):
                        b02.insert(i2+j,b2[list_b[i1]]+'/'+list_b[i1])
                else:
                    b02.append(each)
            b01 = b02
        print(' '.join(b02))
    else:
        print(' '.join(b01))
if __name__=='__main__':
    get()
    # 例子
    # a = 'singer_周杰|周杰倫|劉德華|王力巨集;song_冰雨|北京歡迎你|七里香;actor_周杰倫|孫儷'
    # b = '請播放周杰倫的七里香給我聽'

下面給出第2題的題目截圖,有興趣的夥伴一起討論~
這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述