网易2021笔试题之拆分素数、关键词个数、排队买票

文章目录

  • 1、拆分成尽可能多的素数
    • 思路:
  • 2、网易 关键词个数
    • 代码
  • 3、排队买票
    • 思路:
    • 代码:

1、拆分成尽可能多的素数

牛牛现在有n个正整数的数组a,牛牛可以将其中的每个数a[i]都拆成若干个和为a[i]的正整数,牛牛想知道拆后(也可以一个都不拆)这个数组最多能有多少个素数。
输入描述: 第一行一个正整数n表示数组的长度 第二行n个正整数表示a[i]的值 1 <= n <= 1e6,1 <= a[i] <= 1e9
输出描述: 拆后数组最多的素数个数
示例1 输入 3 1 1 1 输出 0 说明:由于1不能再拆,并且1不是素数,所以拆后最多有0个素数

思路:

想拆成最多的素数,那么就得拆的素数最小,即2,3,;所以这道题的主要就是把每一个数都拆成 2,3尽可能的多
代码:

本来想着需要分情况讨论,元素是1就不加,元素是2、3就加1,否则就加上元素整除以2的除数。
但是后来发现根本不用,因为1 整除2等于0,2、3整除2还是1,所以直接用一行代码 元素//2就可以

'''
# 本来想着需要分情况讨论,元素是1就不加,元素是2、3就加1,否则就加上元素整除以2的除数。
# 但是后来发现根本不用,因为1 整除2等于0,2、3整除2还是1,所以直接用一行代码 元素//2就可以
n = int(input())
a = [int(item) for item in input().strip().split()]
count = 0
for i in range(n):
    if a[i]==1:
        continue
    elif a[i] == 2 or a[i] == 3:
        count += 1
    else:
        m = a[i] // 2
        count += m
print(count)
'''

n = int(input())
a = [int(item) for item in input().strip().split()]
count = 0
for i in range(n):
    count += a[i] // 2
print(count)

2、网易 关键词个数

小易今天读了篇英语文章,他现在想从里面找出一个单词作为这篇文章的关键问,一个单词可以作为关键词当且仅当它在这篇文章中出现的频率不低语1%,现在他想知道有多少个不同的单词可以作为关键词。
一个单词出现的频率 = 这个单词出现的次数/这篇文章中单词总数
输入描述, 第一行一个正整数n,代表这篇文意的单词总数 接下来n行每行一个学符串,代表一个单词,单词仅由大小写英文字母组成 1 <= n <= 10^6 保证所有的字符串长度之和不超过10号 输出: 仅一行一个整数表示答案,
输入: 5 I I am a boy
输出: 4

考试过程中写的:只能过60%
我要被自己的蠢气死了!!
1% = 0.1?
1% = 0.01 啊啊啊大哥啊
这么简单的题目 我居然做不对!!

代码

n = int(input())
d = {}
for i in range(n):
    dc = input()
    dc = dc.lower()
    if dc not in d:
        d[dc] = 1
    else:
        d[dc] += 1
count = 0
for item in d:
    if d[item] / n >= 0.01: # 这里考试写的0.1 一直只通过60% 真的被气炸了 
        count += 1
print(count)

3、排队买票

现在有n个人排队买票,已知是早上8点开始卖票,这几个人买票有两种方式:
第一种是每一个人都可以单独去买自己的票,第1个人花费a秒。
第二种是每一个人都可以选择和自己后面的人起买票,第i个人和第i+1个人共花费印秒。
最后一个人只能和前面的人起买票或单独买票。
由于卖票的地方想早些关门,所以他想知道他最早几点可以关门,请输出一个时间格式形如:08:00.40 am/pm。时间的数字要保持2位,若是上午结束,是am,下午结束是pm
输入描述:
第一行输入一个整数T,接下来对于每组测试数据:输入一个数n,代表有n个人买票。
接下来n个数,代表每一个人单独买票的时间a[i].
接下来n个数,代表每一个人和他前面那个人起买票需要的时间b[i]
1 1<=n<=2000
1<=a[li]<=50
1<=b[1]<=50

输出:
对于每组数据,输出一个时间表示关门的时间
示例:
输入:

2
2
20 25
40
1
8

输出:

08:00:40 am
08:00:08 pm

考试过程中写的,错误百出,
大概思路是:

  • 用一个二维的数组dp[i][k],(【【 , ,】,【 , ,】…】)表示排队时长,i表示第i个人,
  • k取三个值0,1,2:0 表示i这个人和前面的人一起买, 1 表示自己单独买,2 表示 和后面的人一起买
  • 那么每个人都要计算出来三种选择的值各是多少。
  • 第一个人和最后一个人要单独计算
  • 中间的人,如果和前面的人一起买,那么就是i-1时k=2的数
  • 如果自己单独买,那么就是就是前面人单独买或者前面和前面的人一起买这两者的最小值
  • 如果和后面的人一起买,那么还是从 前面人单独买的值或者前面和前面的人一起买的值 这两者的最小值
    说的我都晕了 所幸有的结果是对的,不过我理解错了,下午的时间是要转换成12小时制的,我依然按照24小时计算的,实际应该减去12
T = int(input())
for t in range(T):
    n = int(input())
    
    a = [int(item) for item in input().strip().split()]
    b = [int(item) for item in input().strip().split()]
    dp = [[0 for _ in range(3)] for _ in range(n)]
    dp[0][0] = a[0]
    dp[0][1] = a[0]
    dp[0][2] = b[0]
    for i in range(1,n-1):
        dp[i][0] = dp[i-1][2]
        dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + a[i]
        dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + b[i]
    dp[n-1][0] = dp[n-2][2]
    dp[n-1][1] = min(dp[n-2][0],dp[n-2][1]) + a[n-1]
    dp[n-1][2] = min(dp[n-2][0],dp[n-2][1]) + a[n-1]
    ans = min(dp[n-1])
    hour = ans // 3600 + 8
    hour = str(hour)
    hour = hour.rjust(2,'0')
    mins = (ans % 3600) // 60
    mins = str(mins)
    mins = mins.rjust(2,'0')
    miao = ans % 3600 % 60
    miao = str(miao)
    miao = miao.rjust(2,'0')
    if  int(hour) <= 12:
        print(hour + ':' + mins + ':' + miao + ' '+ 'am')
    else:
        print(hour + ':' + mins + ':' + miao + ' ' + 'pm')
   

下来后和同学讨论了一下,同学的思路非常好,直接用一维数组就可以了。动态规划数组dp,dp[i]前i个人完成排队的最小时间。每个人有两种选择,第一种自己买,第二种和前面一个人一起买,因为是前i个人,所以不考虑和后面那个人一起买的情况。

思路:

每次只需要考虑当前这个人,是和前面的人一起买,还是自己单独买,dp[i]取这两者的最小值

  • 和前面的人一起买,那么就是 dp[i-2] + b[i-1]
  • 如果自己买,那么就是 dp[i-1] + a[i]
  • 由于涉及到前2个位置的数,所以dp数组声明的长度是 n+1 而不是 n ,
  • 那么上面对应的分别是 dp[i-2] + b[i-2] 、dp[i-1] + a[i-1]
  • dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1])。
  • 边界情况 dp[1]=a[1](第一个人只能自己买),dp[2] = min(dp[1]+a[2],dp[0]+b[1]),所以dp[0]也需要初始化,没人的时候不用排队所以为0,后面的通过上一条的状态转移方程获得。

代码:

T = int(input())
for t in range(T):
    n = int(input())
    if n == 0:
        print('08:00:00 am')
        continue
    elif n == 1:
        ans = int(input())
    else:
        a = [int(item) for item in input().strip().split()]
        b = [int(item) for item in input().strip().split()]
        dp = [0 for _ in range(n + 1)]
        dp[1] = a[0] # 第一个人前面没有人,所以只能自己买
        for i in range(2, n + 1):
            dp[i] = min(dp[i - 1] + a[i - 1], dp[i - 2] + b[i - 2])  # 要么单独自己买,要么和前面的人一起买
        ans = dp[n]
    hour = ans // 3600 + 8
    mins = ans % 3600 // 60
    miao = ans % 3600 % 60
    if hour <= 12:
        print(str(hour).rjust(2,'0') + ':' + str(mins).rjust(2,'0') + ':' + str(miao).rjust(2,'0') + ' ' + 'am')
    else:
        print(str(hour-12).rjust(2,'0') + ':' + str(mins).rjust(2,'0') + ':' + str(miao).rjust(2,'0') + ' ' + 'pm')

你可能感兴趣的:(笔试真题,Python,数据结构与算法)