2021网易秋招面试题(节选)
题目一:拆分成尽可能多的素数
-
牛牛现在有n个正整数的数组a,牛牛可以将其中的每个数a[i]都拆成若干个和为a[i]的正整数,牛牛想知道拆后(也可以一个都不拆)这个数组最多能有多少个素数。
-
问题简述:给一个数组,求,数组中的每个元素可由多少个素数组成,求总和。
-
输入描述:第一行:一个正整数n表示数组的长度;
第二行n个正整数表示a[i]的值
-输出描述:拆后数组最多的素数个数。 -
示例1:
输入 :3 1 1 1
输出: 0 -
说明: 由于1不能再拆,并且1不是素数,所以拆后最多有0个素数
-
素数:个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数
初始思路:想拆成最多的素数,那么就得拆的素数最小,即2,3,;所以这道题的主要就是把每一个数都拆成 2,3尽可能的多
个人思考:
本来想着需要分情况讨论,元素是1就不加,元素是2、3就加1,否则就加上元素整除以2的除数。
但是后来发现根本不用,因为1 整除2等于0,2、3整除2还是1,所以直接用一行代码 元素//2就可以
a = [3,1,1,1]
n = len(a) # 数组长度
#print(type(a))
#a = [int(item) for item in input(a).strip().split()]
#a = list(map(int, input().strip().split(" ")))[:n]
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)
#优化:
a0 = [3,1,1,1]
n = int(input(a0))
a = [int(item) for item in input().strip().split()]
count = 0
for i in range(n):
count += a[i] // 2
# 这里可以定义一个函数去执行
'''
1.map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
map() 函数语法:map(function, iterable, ...) 返回迭代器
2.split() 通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。
split() 方法语法:str.split(str="", num=string.count(str))
参数:
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。默认为 -1, 即分隔所有。
返回值:
返回分割后的字符串列表。
3.strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
strip()方法语法:str.strip([chars]);
参数
chars -- 移除字符串头尾指定的字符序列。
返回值
返回移除字符串头尾指定的字符序列生成的新字符串
'''
题目二:网易 关键词个数
- 小易今天读了篇英语文章,他现在想从里面找出一个单词作为这篇文章的关键词,一个单词可以作为关键词当且仅当它在这篇文章中出现的频率不低于1%,现在他想知道有多少个不同的单词可以作为关键词。
- 一个单词出现的频率 = 这个单词出现的次数/这篇文章中单词总数
- 输入描述:
第一行一个正整数n,代表这篇文意的单词总数,
输出: 关键词个数
输入: 5IIamaboy
#比较简单直接上代码
a ='5IIamaboy'
n = len(a)
d = {}
for i in range(n):
dc = a[i]
if dc not in d:
d[dc] = 1
else:
d[dc] += 1
print(d)
count = 0
for item in d:
if d[item] / n >= 0.01:
count += 1
print(count)
*题目三:切换大小写
- 在PC端切换大小写有两种方式:
1、Caps Lock 切换大小写状态,需要按键一次。
2、shift + 字母 临时切换,需要同时按住2个键,记为两次。
现给定一个仅包含大小写的字符串,求出打印此字符串所需的最少按键数。 - 输入:第一行:N(字符串长度)
第二行:String(仅包含英文大小写字母的字符串)
输出:第一行:n(打印出字符串的次数) - 例:
输入:6 AaAAAA
输出:8 - 思路
个人理解来看,这道题的思路:大写字母出现与否?出现在什么位置?是否连续出现?对于解答此题很有帮助。具体情况:
情况一:如果大写字母未出现,字符串长度即为按键次数。
情况二:如果大写字母仅出现一次,按键次数等于len(str)+1。
情况三:大写字母出现多次,这种情况就相比前两种稍微复杂一些。我们要考虑字母出现的位置,和字母前面的字母与后面的字母的大小写情况 - 具体分析如下:
1、字母出现在开头,后面的字母不论大小写:Aa、AA,按此大写字母均需多按一个键。
2、字母出现在结尾,前面的字母区分大小写,前面为小写字母时aA,按键+1,前面为大写字母时AA,按键不变。
3、字母出现在中间(非开头结尾),当前后字母均为大写时(AAA),按键不变。否则(aAA,aAa,AAa),按键加一。
# 代码
# 编码环境:python3.7
# 输入的字符串
s = '7\nAaAAAAA'
# 处理字符串,获取长度N和字母列表
N = int(s.split('\n')[0])
words_list = [item for item in s.split('\n')[1]]
# 定义判断大小写函数
def is_upper(word):
if word == word.upper():
return True
# 创建列表,将大写字母的索引存入列表中
upper_indexes = []
for index,item in enumerate(words_list):
'''
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法
enumerate(sequence, [start=0])
参数
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
返回值
返回 enumerate(枚举) 对象。
'''
if is_upper(item):
upper_indexes.append(index)
print(upper_indexes)
# 定义判断索引函数
def judge_index(index):
if index == 0:
return '0'
if index == len(words_list)-1:
return '-1'
else:
return '1'
# 定义计算按键次数的函数
def counts(index_target):
# 定义计数器
count = N
if len(index_target) == 0:
return count
elif len(index_target) == 1:
return count+1
else:
for index in index_target:
if judge_index(index) == '0':
count += 1
elif judge_index(index)=='-1':
if not is_upper(words_list[index-1]):
count += 1
else:
if is_upper(words_list[index-1]) and is_upper(words_list[index+1]):
count += 0
else:
count += 1
return count
print(counts(upper_indexes))
#输出
print(9)