金九银十即将来临,整理了一份某手、某行的笔试题,如有更优解法,欢迎交流
题一:
实现一个函数,参数是一个字符串,一个是子串长度。返回要求符合长度的子串出现最多次数的子串以及出现次数,如果最多出现次数有多个子串,都输出。
例如:
输入:
allstr = 'ababbcbcbccdcdcd ’
sublen = 2
输出 :
最大出现次数为3,
子串为[“bc”, “cd”]
allstr = 'ababbcbcbccdcdcd '
def findit(allstr, sublen):
allstr = allstr.strip()
cut_allstr = [allstr[i:i+sublen] for i in range(0,len(allstr),sublen)]
dic = {}
for i in cut_allstr:
if i not in dic.keys():
dic[i] = cut_allstr.count(i)
r = list(dic.values())
c = max(r,key=r.count)
ks=[k for k,v in dic.items() if v==c]
print(f'最大出现次数为:{c}')
print(f'子串是: {ks}')
findit(allstr,2)
题二
实现一个斐波那契数列,请用2种不同方法,并分析时间复杂度,及算法性能
def fib(n):
"""
递归实现
时间复杂度O(2^n)
求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)...
以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,
从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,
算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方
【注】递归深度报错及处理
"""
if n<=2: return 1
return fib(n-1)+fib(n-2)
def fib(number):
"""
生产器实现
时间复杂度为O(n)
效率比递归算法快得多,算法的时间复杂度与n成正比
"""
n,a,b = 0, 1, 1
while n < number:
yield a
a, b = b, a + b
n += 1
题三
统计各个部分工资记录数
部门表departments简况如下
dept_no | dept_name |
---|---|
d001 | Finace |
d002 | Jack |
部门员工关系表dept_emp简况如下
emp_no | dept_no | from_date | to_date |
---|---|---|---|
10001 | d001 | 2001-06-22 | 9999-01-01 |
10002 | d002 | 1996-08-03 | 9999-01-01 |
10003 | d003 | 1997-06-21 | 9999-01-01 |
薪水表salaries简况如下
emp_no | salary | from_date | to_date |
---|---|---|---|
10001 | 86097 | 2001-06-22 | 9999-01-01 |
10001 | 88907 | 2001-06-22 | 9999-01-01 |
10002 | 77685 | 1996-08-03 | 9999-01-01 |
10003 | 55675 | 1997-06-21 | 9999-01-01 |
请你统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum,按照dept_no升序排序,以上例子输出如下:
dept_no | dept_name | sum |
---|---|---|
d001 | Finace | 3 |
d002 | Jack | 1 |
SELECT d.dept_no, d.dept_name, count(s.salary) AS SUM
FROM departments d JOIN dept_emp de ON d.dept_no = de.dept_no
JOIN salaries s ON de.emp_no = s.emp_no
GROUP BY d.dept_no
ORDER BY d.dept_no ASC