笔试题 | 数据挖掘岗位 | 数据结构、数据处理
这段时间,在北京游荡了好几圈,黑了3层皮,做了好几家的笔试题,我将整理分享出来,以供大家求职找工作参考。
写这篇文章前,发生了这样的一段对话,只是为了撸串的交易
周末撸串吃什么味的好呢?要好好砍他一顿(阴笑脸)。好了,开始正文下面的内容。
第一题 两数的和
Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they addup to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.You may assume that each input would have exactly one solution.Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2
题目解读:
给定一个数组,找出两个数的和等于给定的目标值,返回两个数的下标
第一个数的下标比第二个数的小
方案唯一:只存在一个解满足和等于target
下标计数不是从0开始
思路一:暴力法
对所有的元素遍历,将满足条件的打印出来。这种方法的复杂度高,适合小数组。图解如下:
试着来用python实现下:
# -*- coding: utf-8 -*-
def twoSum(value,target):
if ((value == None) or (len(value) < 2)):
return ("zeros or length is too small")
else:
lena = len(value)
for i in range(lena):
for j in range(i+1,lena):
if value[i] + value[j] == target:
print ("the two number are %d and %d ,the index are %d and %d " % (value[i],value[j],i,j))
if __name__ == "__main__":
a = [2,7,6,1]
target = 9
print (twoSum(a,target))
还能不能调整下代码呢?优化代码,减少复杂度呢?我想了想,要是原数组是排好序的该多好啊,那就不容易多了。
思路二 :排序法
嘿嘿,说干就干,来把它实现下。代码如下:
# -*- coding: utf-8 -*-
res = []
def sum_two_1(a,target):
if (len(a) < 2):
return (0)
a1 =sorted(a)
i=0;j=len(a1)-1;k=0;
while(i<j):
if (a1[i]+a1[j] == target):
k=k+1
res.append([a1[i],a1[j],a.index(a1[i])+1,a.index(a1[j])+1])
i = i + 1
j = j -1
elif(a1[i]+a1[j] > target):
j = j -1
else:
i = i +1
return(res)
if __name__ == "__main__":
a = [1,8,3,5]
print(sum_two_1(a,int(4)))
好了,就先这两种方案。你看到没?其实这两种方案可以解决多个解的问题哟。不信啊,你撸下代码试试看。
第二题 时间数据处理
题目:以上为百度新闻的⼏几个新闻检索结果,对应的新闻发布时间形式各不不相同,请编程对以上时间数据格式进⾏行行转换处理理,使其输出格式为标准的”yyyy-MM-dd HH:mm:ss”格式
题目解读:
1、需要处理的数据
- xx秒前、xx分钟前、xx小时前
- 统一格式:转换为yyyy-MM-dd HH:mm:ss
2、不一致的数据处理
将xx秒前等数据与xx年xx月xx日 xx:xx数据处理成格式一致的
分析:
1、先判断是否有前字存在,再来判断是秒、分钟、时中哪一种情况,之后将获取的数字(字符格式)转为数值格式,最后使用datetime包,利用当前的时间来反向推出时间。代码如下:
if i[-1] == '前':
a = i.split("前")[0]
if a[-1] == '秒':
b = now - timedelta(seconds=int(a[:-1]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
if a[-2:] == '分钟':
b = now - timedelta(minutes=int(a[:-2]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
if a[-2:] == '小时':
b = now - timedelta(minutes=int(a[:-2]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
2、做格式转换,将当前的时间格式转为我们预定的格式即可,这里仍是用到datetime包。发现了没有,原数据是没有秒级时间的,所以需要加上去。代码如下:
time_str1 = i + ":00"
time = datetime.strptime(time_str1, '%Y年%m月%d日 %H:%M:%S')
data.append(time.strftime("%Y-%m-%d %H:%M:%S"))
你对两类情况都做了分析,还写了代码,是否可靠呢?要不拉出来跑一跑结果,怎么样?哼,谁怕谁呢?来上代码:
# -*- coding: utf-8 -*-
from datetime import datetime
from datetime import timedelta
def date_deal1(time_str):
now = datetime.now()
data = []
for i in time_str:
if i[-1] == '前':
a = i.split("前")[0]
if a[-1] == '秒':
b = now - timedelta(seconds = int(a[:-1]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
if a[-2:] == '分钟':
b = now - timedelta(minutes = int(a[:-2]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
if a[-2:] == '小时':
b = now - timedelta(minutes = int(a[:-2]))
data.append(b.strftime("%Y-%m-%d %H:%M:%S"))
else:
time_str1 = i + ":00"
time = datetime.strptime(time_str1, '%Y年%m月%d日 %H:%M:%S')
data.append(time.strftime("%Y-%m-%d %H:%M:%S"))
return data
if __name__ == "__main__":
time_str = ['2017年07月16日 21:00','6分钟前','20小时前','6秒前']
print (date_deal1(time_str))
测试结果
[‘2017-07-16 21:00:00’, ‘2017-07-24 17:08:05’, ‘2017-07-24 16:54:05’, ‘2017-07-24 17:13:59’]
你看,是不是很符合要求啊。欢迎指正不足点,谢谢!
总结
- 第一题,主要考察数据结构的灵活运用,还有代码逻辑;
- 第二题,是datetime包的使用,尤其timedelta、strftime、strptime函数的使用。
上一篇: powermock
下一篇: 【实用】游戏开发岗位常见笔试题知识点汇总