【携程集团】2021春招-在线专业笔试 2021-04-01

第一题

SQL结构分析
时间限制: 3000MS
内存限制: 589824KB
题目描述:
给定一个完整的SQL,请编写一个函数,找出SQL中的表名。部分SQL中可能生成了中间表,请不要输出这些表名。同一个表名只输出一次即可。
输入描述
完整的SQL,以两个换行结尾。
输出描述
SQL中所有的原始表名,每行一个表名。
如果有多个表名,按照出现的先后顺序输出。

样例输入
select t.id, t.name, t.tag_id
from (
select user.id, user.name, tag.tag_id
from user
inner join user_tag
) t

样例输出
user
user_tag

import re

def extract_table_name_from_sql(sql_str):
    # remove the /* */ comments
    q = re.sub(r"/\*[^*]*\*+(?:[^*/][^*]*\*+)*/", "", sql_str)
    # remove whole line -- and # comments
    lines = [line for line in q.splitlines() if not re.match("^\s*(--|#)", line)]
    # remove trailing -- and # comments
    q = " ".join([re.split("--|#", line)[0] for line in lines])
    # split on blanks, parens and semicolons
    tokens = re.split(r"[\s)(;]+", q)
    # scan the tokens. if we see a FROM or JOIN, we set the get_next
    # flag, and grab the next one (unless it's SELECT).
    result = []
    get_next = False
    for token in tokens:
        if get_next:
            if token.lower() not in ["", "select"]:
                result.append(token)
            get_next = False
        get_next = token.lower() in ["from", "join"]

    return result


sql = ""
while True:
    string = input()
    if string != '':
        sql = sql + string + " "
    else:
        break
data_list = extract_table_name_from_sql(sql)
for table_name in data_list:
    print(table_name)

ps: 没做出来,答案是交卷后在网上找的。

第二题

商旅出行优惠套餐计算最低成本
时间限制: 3000MS
内存限制: 589824KB
题目描述:
携程商旅最近上线了一批优惠权益套餐,作为公司的一名采购, 为了降低公司差旅出行成本, 你决定购买员工使用频率较高的各项权益, 因此需要决定购买哪些套餐,不仅需要覆盖要求的具体权益项, 同时确保成本最低.
携程商旅提供n种不同的权益: 酒店优惠券、接送机立减券、超级会员等, value[0], value[1], ... , value[n-1]。
将各类权益组合成权益包进行出售,package[0], package[1], ... , package[m-1]每种权益包可能包含一种或多种权益。
权益包对应的价格分别为price[0], price[1], ... , price[m-1],price[i]为一个整数,代表第i个权益包对应的价格。
用户指定需要覆盖的k种权益, value[0], value[1], ... , value[k-1](1<=k<=n)
计算出所需最低花费,即从m个权益包中选取出一种组合,能够满足需要的k种权益,同时成本最低。
如果提供的权益包组合不能满足需要的k种权益,则输出 -1

输入描述
第一行:n(如3种权益, 分别为: 1,2,3, 1<n<10000);
第二行:package
第三行:price
第四行:value
输出描述
5(权益包1 + 权益包3,满足需要的权益1,2,3, 对应价格分别为3,2成本最低)

样例输入
3
1,2 2,3 1,3
3 4 2
1 2 3
样例输出
5

提示
样例一共有3种权益 1,2,3;有三种权益组合:(1,2),(2,3),(1,3)对应的价格为:3,4,2;你需要的权益为1,2,3。
满足权益组合: 包1 + 包2 = 3 + 4 = 7元, 包1 + 包3 = 3 + 2 = 5元.
满足最低成本: 包1 + 包3 = 3+2
最终输出结果: 5

import copy

n = input()
package = input().split()
price = input().split()
value = input().split()
# print(n, package, price, value)
money = 0
cheapest = []
tmp_value = copy.deepcopy(value)
for circle in range(2**len(value)):
    for pack in package:
        flag = 0
        for i in range(len(value)):
            if value[i] in pack:
                # print(pack)
                try:
                    tmp_value.remove(value[i])
                    flag = 1
                except ValueError:
                    pass
        if flag == 1:
            money += int(price[package.index(pack)])
        if len(tmp_value) == 0:
            cheapest.append(money)
            money = 0
            for i in value:
                tmp_value.append(i)
cheapest.sort()
print(cheapest[0])

ps: 考场上脑子一热,写出的垃圾代码,只AC了64%
这一波算法题做下来,可把自己垃圾坏了……

携程2021年4月1日春招笔试,就只有这两道算法题,感兴趣的大佬可以试试。

#校招##携程##面经#
全部评论
大佬牛X,我应该凉凉了,Java是真的不好解
点赞 回复
分享
发布于 2021-04-01 22:42
楼主你好,请问你是什么岗位?开发的话,是Java方向还是C++方向?或者其他语言方向~
点赞 回复
分享
发布于 2021-04-04 18:40
阅文集团
校招火热招聘中
官网直投
不知道我的想法对不对。 贪心,每次选平均价格最低,一次性满足权益最多的包。 初始时需要满足权益1,2,3; 花费金额是0 对于包(1,2),能满足两个权益,平均价格是3/2=1.5 对于包(2,3),能满足两个权益,平均价格是4/2=2 对于包(1,3),能满足两个权益,平均价格是2/2=1 选择包(1,3)之后 需要满足的权益只有2;花费金额是2 对于包(1,2),能满足一个权益,平均价格是3/1=3 对于包(2,3),能满足一个权益,平均价格是4/1=4 选择包(1,2) 需要满足的权益为空;花费金额是2+3=5,结束。
点赞 回复
分享
发布于 2023-03-04 10:43 江苏

相关推荐

4 5 评论
分享
牛客网
牛客企业服务