编程语言
首页 > 编程语言> > 阿里-2019算法岗笔试编程题-kmp匹配

阿里-2019算法岗笔试编程题-kmp匹配

作者:互联网

阿里的编程题真的好接地气,感觉就是把项目中的一个小小的部分拿来了吧,完全打个措手不及;

这里写图片描述

开始正文

阿里:编程题1

这里写图片描述

请使用标准输出(sys.stdout);已禁用图形、文件、网络、系统相关的操作,如Process , httplib , os;缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用;如果使用sys.stdin.readline,因为默认会带换行符,所以要strip(’ ‘)进行截取;建议使用raw_input()
时间限制: 3S (C/C++以外的语言为: 5 S) 内存限制: 128M (C/C++以外的语言为: 640 M)
输入:
输入数据包含两行,
第一行,实体列表,多种实体之间用分号隔开,实体名和实体值之间用下划线隔开,多个实体值之间用竖线隔开,所有标点都是英文状态下的,格式如下:
实体名称1_实体值1|实体值2|…;实体名称2_实体值1|实体值2|…;…
第二行,用户的自然语言指令
输出:
被标记了关键词的指令。指令中的关键词前后加一个空格被单独分出来,并在后面跟上”/”+实体名称来标记。如果一个实体值属于多个实体,将这些实体都标记出来,并按照实体名称的字符串顺序正序排列,并以逗号分隔。
输入范例:
singer_周杰|周杰伦|刘德华|王力宏;song_冰雨|北京欢迎你|七里香;actor_周杰伦|孙俪
请播放周杰伦的七里香给我听
输出范例:
请播放 周杰伦/actor,singer 的 七里香/song 给我听


个人答案,说到底就是字符串的处理问题,我先将关键字部分暴力搜索提取出来放在一个哈希表里,然后根据输入的情况,不断从哈希表里查找,输出结果,这里放上自己的答案,没有全部AC,有问题请各位指出:


def Solve(inputs, dicts):
    res = ""
    i = len(inputs) - 1
    while i>=0:
        j = i - 1
        s = inputs[j:i+1]
        while j>=0 and s not in dicts:
            j -= 1
            s = inputs[j:i+1]

        if s in dicts:
            res = ' ' + s + '/' + dicts[s] + ' '+ res
            i  = j-1
        else:
            res = inputs[i] + res
            i -= 1
    return res

import sys
if __name__ == '__main__':
    ss = input().split(';')
    dicts = {}
    names = []

    for s in ss:
        s = s.split('_')
        s[1] = s[1].split('|')
        for i in range(len(s[1])):
            key = s[1][i]
            if key not in dicts:
                dicts[key] = s[0]
            else:
                dicts[key] = dicts[key] + ',' + s[0]
        names += s[1]

    strings = input()

    res = Solve(strings, dicts)

测试结果:
我的Linux没有中文的,所以我就直接提取了每个字的第一个字母代替这个字做测试;
输入:

singer_zj|zjl;song_by|qlx;actor_zjl|sl
qbfzjldqlxgwt
  • 1
  • 2

输出情况:
这里写图片描述
从单个测试结果来看,还是正确的,但是不确定中文情况下行不行,我的结果也没有全部AC

阿里编程第二题

这里写图片描述
请使用标准输出(sys.stdout);已禁用图形、文件、网络、系统相关的操作,如Process , httplib , os;缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用;如果使用sys.stdin.readline,因为默认会带换行符,所以要strip(’ ‘)进行截取;建议使用raw_input()
时间限制: 3S (C/C++以外的语言为: 5 S) 内存限制: 128M (C/C++以外的语言为: 640 M)
输入:
输入数据包含两行,
第一行,上述格式的语义模板表达式
第二行,用户的自然语言指令(即:用户query)
输出:
当前query是否匹配当前语义模板表达式。匹配,则输出1,否则输出0.
输入范例:
<[播]放|来>[一|几]<首|曲|个>@{singer}的<歌[曲]|[流行]音乐>
来几首@{singer}的流行歌曲
输出范例:
0


这个题没做出来,好麻烦,事后做了一下,纯暴力切割字符串,一个个做匹配,代码一点也不符合信达雅原则,请轻喷:

def inprocess(strings):
    dicts = {'<':'>', '>':'<', '[':']', ']':'[' }

    flag = []
    i = 0
    res = []
    start = 0
    # split inputs to many strings
    while i <len(strings):
        s = strings[i]
        if s=='<' or s=='[':
            flag.append(s)
            if strings[start]=='@':
                res.append(strings[start:i])
                start = i

        elif flag and s==dicts[flag[-1]]:
            tmp = flag.pop()
            if flag:
                continue
            else:
                res.append(strings[start+1:i])
                start = i+1
            del tmp

        i += 1

    # process the res
    collect = []
    for id, lists in enumerate(res):
        if '|' not in lists:
            collect.append(lists)
            continue

        lists = lists.split('|')
        for s in lists:
            i = 0
            # while i < len(s):
            if s[i]=='[':
                collect.append(s[i+1:s.index(']')])
                i = s.index(']')+1
                if i<len(s):
                    collect.append(collect[-1]+s[i:])

            elif '[' not in s:
                collect.append(s)
    for c in res:
        print(c)
    print(collect)
    return collect

def testing(qurry, collect):
    i = 0
    while i<len(qurry):
        c = qurry[i]
        if c in collect:
            collect = collect[collect.index(c)+1:]
        elif c=='@':
            if qurry[i:qurry.index('}')+2] in collect:
                i = qurry.index('}') + 1
            else:
                return 0
        else:
            return 0
        i += 1
    return 1


if __name__ == '__main__':
    inputs = "<[B]F|L>[Y|J]<S|Q|G>@{singer}G<[Q]|[LX]YL>"
    res = inprocess(inputs)

    qurry = "LJS@{singer}GLXGQ"



我想的是:来几首@{singer}的流行歌曲测试结果为0可能是流行和歌曲放反了???只能是歌曲,流行,流行音乐???喵喵喵???

测试结果:
这里写图片描述

标签:inputs,singer,编程,dicts,输出,res,实体,2019,kmp
来源: https://blog.csdn.net/stay_foolish12/article/details/89052605