一道为了撸串的笔试题
作者:数据取经团——祥大
数据取经团(公众号:zlx19930503)
专注R、Python数据分析挖掘、可视化、机器学习等
这段时间,在北京游荡了好几圈,黑了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']
你看,是不是很符合要求啊。欢迎指正不足点,谢谢!
【后期预告】
python的库datetime学习
关注后在公众号内回复“课程”即可获取:
1.崔老师爬虫实战案例免费学习视频。
2.丘老师数据科学入门指导免费学习视频。
3.陈老师数据分析报告制作免费学习视频。
4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
5.丘老师Python网络爬虫实战免费学习视频。
为大家提供与Python相关的最新技术和资讯。
长按指纹 > 识别图中二维码 > 添加关注