2022.8.20 科大讯飞秋招笔试

问题1 汉宁窗

题目描述:汉宁窗公式为HanWin=0.5*(1-cos(2*PI*n/N)),N为窗口长度,0<=n<N,PI=3.1415927;

对任意长度为N的双字节整数序列x(n),加窗之后为y(n)=x(n)*HanWin(n)

输入输出描述:输入第一行窗口长度N,第二行输入N个双字节整数x(n),空格隔开

        输出:N个加窗之后的数据y(n)

思路:这个没啥,就算就行了;可惜估计精度问题,只通过80%

import math
def HanWin(n, N):
    PI = 3.1415927
    return 0.5*(1-math.cos(2*PI*n/N))
def solution1():
    PI = 3.1415927
    N = int(input())
    arr = [int(x) for x in input().split()]
    ans = []
    for n in range(N):
        x = arr[n]
        y = x * HanWin(n, N)
        print(y)
        if y < 0:
            y = int(y - 0.5)
        else:
            y = int(y + 0.5)
        ans.append(str(y))
    print(' '.join(ans))

问题2 语音识别

题目简述:设计一种英文敏感词查找算法

  1. 其中敏感词/词组可以包含英文字母、数字、空格、英文中的符号;
  2. 一个字符串文本中包含多个敏感词或词组应该都能找到
  3. 优先匹配到的,后续不在匹配,也就是无重叠匹配
  4. 返回匹配到的敏感字符串的开始和结束位置
  5. 查找10个和10w个的时间基本相当(这个应该用自动机去做,考试期间想不到了,就暴力了,不过也过啦

输入:先输入敏感词列表(一行一个)、空行隔开、待查找文本

输出:敏感词 和敏感词出现的起始位置

例子:

输入:
Every day i go to school
Every day
to school
school

Every day i go to school.

输出:
Every day 0 8
to school 15 23

思路:先对敏感词做个排序,因为如果有包含关系的,肯定短的在前面,这样就不怕重复了

遍历的时候直接检查是否能匹配上就可以了【这里全A、未超时】

def solution2():
    book = []
    while True:
        s = input()
        if s == '':
            break
        book.append(s)
    sentence = input()
    book = sorted(book)
    l = 0
    while l < len(sentence):
        flag = 0
        for x in book:
            if l + len(x) > len(sentence):
                continue
            elif sentence[l:l+len(x)] == x:
                temp = [x,str(l),str(l+len(x)-1)]
                print(' '.join(temp))
                l += len(x)
                flag = 1
                break
        if flag == 0:
            while l < len(sentence) and sentence[l]!= ' ':
                l += 1
            l += 1

问题3 虫洞跳跃

描述:已知每两个中转站之前的飞行方向、是否有虫洞,给出每个中转站给飞船的最大补给的能量体个数(一次虫洞中转需要消耗1个能量)

通俗点:给你一个有向图,计算从每个节点出发,能到达的最远的距离(能抵达说明两者之间的连接是True)

输入输出:

输入
8
1 3 true
1 4 false
3 5 true
4 7 false
4 6 true
6 2 false
7 2 true
输出
1 3
2 0
3 2
4 2
5 1
6 0
7 1

思路:其实就是图的遍历

def solution3():
    n = int(input())
    rd = [0] * 100005
    G = [[] for i in range(100005)]
    ans = [0] * 100005
    book = set()
    for i in range(n):
        s = input()
        x, y, state = s.split()
        book.add(x)
        book.add(y)
        x = int(x)
        y = int(y)
        if state == 'true':
            rd[x] += 1
            G[y].append(x)
    q = []
    q_head = 0
    for i in range(100005):
        if rd[i] == 0:
            q.append(i)
    while q_head < len(q):
        x = q[q_head]
        q_head += 1
        for y in G[x]:
            rd[y] -= 1
            ans[y] = max(ans[y], ans[x] + 1)
            if rd[y] == 0:
                q.append(y)
    book = list(book)
    book = sorted(book)
    for x in book:
        print(x, ans[int(x)])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值