python大数据处理面经

2014-12-19 11:15:04 u010700335 阅读数 11670

(0)目录

快速学Python 和 易犯错误(文本处理)

Python文本处理和Java/C比对

十分钟学会Python的基本类型

快速学会Python(实战)

大数据处理之道(十分钟学会Python)

一:python 简介

(1)Python的由来

Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991

年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结

在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,

如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写

(2)Python 语法简介 ---- 类型转化

int(x [,base ])         将x转换为一个整数
long(x [,base ])        将x转换为一个长整数
float(x )               将x转换到一个浮点数
complex(real [,imag ])  创建一个复数
str(x )                 将对象 x 转换为字符串
repr(x )                将对象 x 转换为表达式字符串

eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s )               将序列 s 转换为一个元组
list(s )                将序列 s 转换为一个列表
chr(x )                 将一个整数转换为一个字符
unichr(x )              将一个整数转换为Unicode字符
ord(x )                 将一个字符转换为它的整数值
hex(x )                 将一个整数转换为一个十六进制字符串
oct(x )
             将一个整数转换为一个八进制字符串

(3)Python 语法简介 ---- 类型转化

s + r                   序列连接
s * n , n * s           s的 n 次拷贝,n为整数
s % d                   字符串格式化(仅字符串)

s[i]                    索引
s[i :j ]                切片
x in s , x not in s     从属关系
for x in s :            迭代
len(s)                  长度
min(s)                  最小元素
max(s)                  最大元素
s[i ] = x               为s[i]重新赋值
s[i :j ] = r            将列表片段重新赋值
del s[i ]               删除列表中一个元素

del s[i :j ]            删除列表中一个片段

(4)(3)Python 语法简介 ---- 类型转化

x >> y                  右移
x & y                   按位与
x | y                   按位或
x ^ y                   按位异或 (exclusive or)
~x                      按位翻转
x + y                   加
x - y                   减
x * y                   乘
x / y                   常规除
x // y                  地板除
x ** y                  乘方 (xy )

x % y                   取模 (x mod y )
-x                      改变操作数的符号位
+x                      什么也不做
~x                      ~x=-(x+1)
abs(x )                 绝对值
divmod(x ,y )           返回 (int(x / y ), x % y )
pow(x ,y [,modulo ])    返回 (x ** y ) x % modulo
round(x ,[n])           四舍五入,n为小数点位数

x < y                   小于
x > y                   大于
x == y                  等于
x != y                  不等于(与<>相同)

x >= y                  大于等于
x <= y                  小于等于

二:python应用

(1) 文件处理

filename = raw_input('Enter your file name')  #输入要遍历读取的文件路径及文件名
file = open(filename,'r')
done = 0
while not  done:
        aLine = file.readline()
        if(aLine != ''):
            print aLine,
        else:
            done = 1
file.close()   #关闭文件 
解释:

.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构

进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

如果Python文件读到了文件尾,则会返回一个空字符串‘’,而如果是读到一个空行的话,则会返回一个‘\n’

Python的readline()方法,每行最后都会加上一个换行字符‘\n’。有时候有的文件最后一行没有以'\n'结尾时,不返回‘\n’。

readlines()方法返回的是一个列表,而readline()返回一个字符串。

(2)错误处理

Python报错TypeError: 'str' object is not callable
当一般内部函数被用作变量名后可能出现此错误。比如:
range=1
for i in range(0,1):
………
就会报这样的错误
这样的错会报在for行,但是时间引起的原因却是在range=1这行,如果两行相距较远,怎很难被发现。所以要特别注意不要用内部已有的变量和函数名作自定义变量名。或者str被预先定义了
str=10
for i in range(1,10):

  print str(i)

(3) 综合应用,文件读取,控制台读取,时间转化,编码转换

import time
from time import strftime
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# -*- coding: cp936 -*-
print ("Hello, Python!")
#!/usr/bin/python
a = 21
b = 10
c = 0

c = a + b
print "Line 1 - Value of c is ", c

c = a - b
print "Line 2 - Value of c is ", c 

c = a * b
print "Line 3 - Value of c is ", c 

c = a / b
print "Line 4 - Value of c is ", c 

c = a % b
print "Line 5 - Value of c is ", c

a = 2
b = 3
c = a**b 
print "Line 6 - Value of c is ", c

a = 10
b = 5
c = a//b 
print "Line 7 - Value of c is ", c
# for repeat its
list = [2, 4, 6, 8]
sum = 0
for num in list:
    sum = sum + num
print("The sum is:", sum)
# print and Input, assignment
print("Hello, I'm Python!")

name = input('What is your name?\n')
print('Hi, %s.' % name)

# test for
fruits = ['Banana', 'Apple', 'Lime']
loud_fruits = [fruit.upper() for fruit in fruits]
print(loud_fruits)

# open, write and read file
fo = open("./tmp/foo.txt","w+")
fo.write("Python is a gerat language.\nYeah its great!!\nI am zhang yapeng, who are you?\n")
t_str = u'我是张燕鹏,您是什么货色?'
print(t_str)
fo.write(t_str)
fo.close()

#read and write
fr = open("./tmp/foo1.txt","r+")
fw = open("foo_rw.txt","wb")
done = 0;
localtime = time.asctime(time.localtime(time.time()))
print "Local current time : ", localtime
fw.write(localtime + "\n")
while not done:
    t_str = fr.readline()
    if(t_str != ''):
        print "Read String is : ", t_str
        fw.write(t_str)
    else:
        done = 1
fr.close()
fw.close()

# test time (import)
localtime = time.localtime(time.time())
print "Local current time : ", localtime
# format the time from time import strftime
t_time = strftime( '%Y-%m-%d %H:%M:%S', localtime)
print "formatting local current time : ", t_time
# design the time by yourself
year = str(localtime.tm_year)
mon = str(localtime.tm_mon)
day = str(localtime.tm_mday)
hour = str(localtime.tm_hour)
mins = str(localtime.tm_min)
sec = str(localtime.tm_sec)
newtime = u"时间是: " + year + "年" + mon + "月" + day + "日 " + hour + ":" + mins + ":" + sec
print "Local current time : ", newtime

(4)运行图:




(5) 总结:

(1)Python是一门入手非常快的语言,处理大数据的好语言,一些规范非常类似于c++语言,例如语法和一些函数命名,文件的打开和读写,以及

读写方式,非常类似于c++

(2)正如,开头所写的 “python是胶水语言,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适

语言改写,如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。

(3)分享一下非常基础的系统的学习网站   

(4)W3CSchool.cc (3)中提到的学习网站是非常基础的人们课程,要是想深入,具体的内容可以百度

2018-09-10 22:33:30 weixin_38104825 阅读数 2339
  • 如何拿到半数面试公司Offer——我的Python求职之路
    • 其中第13点的原理如下:

      子类继承父类后,初始状态下,继承了父类的属性。

      当在子类中修改继承过来的类属性时,并不会修改父类的同名类属性。以后只要是通过子类访问该属性,访问的都是子类的属性;

      通过父类修改了父类属性后,子类访问该属性时,会访问父类修改后的属性值。前提是子类没有对该属性重新赋值过,如果子类修改过该属性,则会遵循上面的规则

    • 第15个求最大公约数是辗转相除法,厉害啦

    • 第16个中位数这个解决方法非常巧妙,它利用了取反数和为1的特性,通过列表负索引来获得列表中位数。

  • =、copy、deepcopy

    • 可以直接参考这篇文章

    • 这篇博客有图感觉讲的更好

    • 我们所说的一般意义的“等于号“相当于引用,即原始队列改变,被赋值的队列也会作出相同的改变。

    • copy是浅拷贝,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

      • Python中的copy动作,对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。

      • 对于子对象,浅拷贝动作会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。

  • 对于子对象,深拷贝动作会将复杂对象的每一层复制一个单独的个体出来,因而二者完全独立。

    al = [[1], [2], [3]]
    bl = copy.copy(al)
    cl = copy.deepcopy(al)
    d1 = al
    
    print "before=>"
    print al
    print bl
    print cl
    print d1
    
    al[0][0] = 0
    al[1] = [2,3]
    
    print "after=>"
    print al
    print bl
    print cl
    print d1
    
    ####################
    '''
    before=>
    [[1], [2], [3]]
    [[1], [2], [3]]
    [[1], [2], [3]]
    [[1], [2], [3]]
    after=>
    [[0], [2, 3], [3]]
    [[0], [2], [3]]
    [[1], [2], [3]]
    [[0], [2, 3], [3]]
    '''

     

##########################分割线############################

  • 瓜子二手车
    • 一面跪
    • 一开始就是自我介绍,然后项目经历

    • 感觉编程题部分答的还可以。。问了这么几道:

      • 如何判断一个单链表是否有环

        • 我说用两个指针,一个快指针一个满指针,他问还有别的方法没那我说就只有笨方法了,在数组中存看过的节点的指针,看有没有重复的

        • 这篇博客总结的很到位

      • 知不知道哈希表,哈希表是怎么解决冲突的

        • 冲突怎么解决的忘了

        • 处理散列冲突的方法

          • 开放定址法

            • 线性探测法:就是一旦冲突了就放到下一个位置就好了,只要存储空间够大总会有位置放的(但是这样会产生堆积,因为他可能会把其他的原来属于别人的位置只是暂时空着的给占了)

            • 二次探测法:冲突了就放在1或者2或者3等等的平方后的位置,而不是像前面那样就是单纯的不停地加1,这样就可以不让关键字对集中在一块地方

            • 随机探测法:用一个种子产生一个随机数来作为位移量来避免冲突,然后最后查找这个数在不在的时候也用这个种子生成随机数来找

          • 再散列函数法:准备多个散列函数,这个冲突了就换下一个,总会有一个能解决冲突的

          • 链地址法:把冲突的放在一个单链表中,冲突的就串在一起就好了

          • 公共溢出区法:把冲突的放在另一个数组中,然后以后查找的时候没找到还要在这个数组中顺序查找一遍

      • 给一个ip地址判断其是否是个正确的ip。。可能有点也可能没有

        • 写了一个没有点的,后面一想有点好像也可以加进去

        • 自己实现了已经

    • 问答题:

      • python的什么什么锁好像是什么r锁

        • 不会

      • 有没有做过并发的东西

        • 没有

      • 知不知道mysql的索引

        • 不知道底层

      • mysql查询起来花的时间多,怎么优化

        • 读到内存里操作呗

      • 数据库的三种设计模式还是设计方法来着

        • 布道

      • 如何判断一个文件有没有被修改过

      • tcp协议如何保持稳定

        • 只知道3次握手4次挥手,但是他说他问的不是这个

      • 要是数据库里的数据内存中装不下的话该怎么办

        • 分批次装

  • 陌陌
    • 一面跪
    • 打了个的到望京,SOHU大厦是真的高级
    • 面试的我小哥看着也就二十多岁吧,感觉也是第一次面?看着比我还紧张
    • 先是让我讲一讲一些排序算法,复杂度啊,思想啊,稳不稳定啊之类的
      • 幸好这些我这几天着重准备了
    • 让写了一个归并排序的代码
      • 幸好我会
    • 然后问有没有比快排这些更快的算法,比如要给陌陌1000个员工按照年龄排序该怎么办
      • 我说用字典直接存储,这样就能达到O(n)了
    • 然后继续数据结构,问我堆和二叉树的差别,二叉树指排序树之类的
      • 然后我就把堆讲了一下啊,这个这几天刚看,树就如是的说只刷过题了
    • 然后就问项目先是问编辑距离的原理和实现方法
      • 幸亏老夫牛皮,我还真记得,但是写那个状态转换方程的时候漏了一种情况,不过还行把,面试老哥说我会这个原理很加分
    • 然后问我数据库除了mysql还会什么,会不会什么数据库的优化方法
      • 不会
    • 看我简历上写的项目经历考了我一道文本处理的题
      • 让用正则切分一个句子,句子里像是‘今天太阳【太阳的表情】好大啊,我很开心【开心的表情】’
      • 没怎么用过re的split不太敢用,然后就用最土的split写出来了一个较为复杂的
    • 开放题:问有一个敏感词过滤系统,我们也有一个敏感词库,如何快速的检测一个句子里是否有敏感词
      • 我就说用find呗,然后问有没有更优化的方法,布道
    • 这老哥人还特好,当面就告诉我不行了进不到二面了但是对我的表现进行了一波点评
      • 数据结构和算法上表现的还是不错(没办法你正好问得全是我熟悉的)
      • 但是数据结构的应用场景也应该了解,不能只会算法,不知道什么时候用
      • 编辑距离能解释出来很加分(嘿嘿嘿)
      • 工具不能只会用还得理解其原理,比如mysql的优化啊、正则具体是怎么实现的啊、python中的一些高级的用法比如in是怎么实现的啊
      • 技能树还得再广一点,比如流行的redis、mongodb也得会
    • 总结:至少是一次很有收获的面试,不错。正好还视察了一下望京,哇再说一次SOHO是真的高级
  • 京东方
    • 应该是能进的
    • 这种类似于国企的地方果然面试的套路不一样
    • 过去就是简单的介绍了一下项目,然后就开始扯淡了,问问能不能出差啊,毕业想留在哪啊之类的
    • 总结:月薪1W差点、要出差一次出差半年、做京东方医院、要加班很辛苦,好处就是稳定(?),全国各地都有比如苏州、合肥、武汉、成都什么的。。
    • 感觉可以以后在北京混不下去了再去
    • 说是10月份发offer,到时候再说吧
  • 猿辅导
    • 一面跪
    • 过去先说说项目
    • 怎么在一个模块下使用另一个文件夹下的模块
    • 问了csrf

    • 又问了数据库的调优,然后要是数据太多怎么办,表里按照grade来group,该怎么加速

    • 写了两个sql,两个编程题,都ok

    • 问gil锁。。不会

    • 问了python的解释器什么的,比如用过哪些python解释器(有哪些我都不太懂呢,看来这个底层也要了解了解)

    • 看来主要是用过的东西要知其所以然

  • 图森未来

    • 不知道情况如何啊,电话面试,总共进行了半多小时。可以分为两个部分先是基础知识部分,就是了解个人的技能树,大概问了20分钟吧,然后给了10分钟左右做编程题

      • 上来先自我介绍

        • 我就一波常规操作

      • 然后问对于数据库的了解

        • 我说基础不太懂,但是讲了一下B+树和索引。主要是用的多

        • 然后问使用

          • 事务?

            • 不会

          • left join 、in

            • 这个我会

      • 然后问操作系统

        • 问进程和线程的同步方式

          • 就几个一个信号量了

        • 让说一说CPU调度算法

          • 我说了先进先上和最短的先上、IO密集型的先上之类的

        • 问LRU和LFU

          • 这个我知道啊,内存置换算法

        • 负载均衡?

          • 告辞

        • 分页和分段的区别

          • 我说分页是固定大小的

          • 貌似分段边长?

          • 忘了

      • 然后问计算机网络

        • TCP如何保持传输的可靠性的

          • 哼,我不会在一个坑死两次

          • 什么收到了回复啊、拥塞控制啊、窗口啊一顿吹

        • GET和POST的区别

          • 不太了解

      • 问python的多态怎么实现的。。

        • 布道

        • 就口胡说了装饰器和可变参数、关键字参数

      • 问DDOS知道不?

        • 告辞

      • 说一说自己熟悉的设计模式

        • 告辞

      • 最后做了一道编程题,这个倒还是发挥的不错,面试官说我的思路是对的,最后也做出来了

  • 天润融通

    • 感觉这公司不行啊

    • 就问了问项目,然后还一直质疑我这个项目没有难度,态度不行

    • 客观的说,公司规模也一般吧,说是部门就10个人计划,然后4个产品,6个技术

    • 让等通知,给了我也不一定去

  • ihandy

    • 这公司不错,在五道口最繁华的地方,有健身房有零食,而且业务好像也很厉害的样子

    • 然后面试内容的话基本就是老一套了其实,我都懒得归纳了,无非就是数据结构、操作系统、计算机网络、数据库、用的语言(python)的一些细节

    • 值得一提的是面试官问上面这些问题的时候我作为一个非科班的每次都是用比较形象的语言解释出来的,然后她说的问题我都有点思路,可能不专业吧,但是给人感觉是活学活用的那种

    • 于是他就表明虽然我现在不行,毕竟细节还是不行,基础还是不够扎实,但是觉得我这个人学的不错,让我这半个月一个月再加把劲学一学,学好了发邮件给他然后他再帮我内推一下,再面试一次~欧耶,这也算是一种认可吧我感觉

    • 然后我还问哦他以下问题

      • 感觉自己项目不行

        • 老哥表明说个鸡儿在校生能有什么项目,还一群编项目骗人的,主要就是基础知识好就行了——这我就放心了

      • 然后感觉自己不是科班的有点虚

        • 老哥表示你以为科班的上了课就会了,也是渣渣,别慌——这我就放心了

    • 被肯定的感觉真好,好好学习继续努力吧

    • 沃日,查了一下内推截止的时间是9.31.。怕是有难度

    • 10-17被喊去面试了,结果一过去就是二面,紧张

      • 果然部门领导问的就是开放性的东西了

        • 先是介绍了部门,我就听

        • 再是问我项目的细节,就是实习嘛。。讲了做了什么怎么做的然后给他推了一波编辑距离的算法

        • 然后就问问题了

          • 先是问了怎么从1000W个数据中找出最大的1000个数

            • 常规操作,堆排序

            • 还让说了一下复杂度

          • 再是问当数据库很大的时候怎么办

            • 我说了索引的一些东西

            • 要是已经读到内存里了那就用字典

            • 然后大佬提了一个类似于倒排文件的数据结构,或者说是类似于那个编码树的方法,可以学到了

        • 然后就基本结束了,问了下期望薪资和能否实习的信息就溜了,等通知说是

  • 360安全

    • 一面跪,感觉老哥就是随便问的。。想到什么问什么,不过都是基础,还行

      • 编辑距离怎么实现的

        • 稳得

      • 问实验室那个登录注册怎么实现的

        • 就是get啦

      • 问TCP和UDP的区别

        • 稳得

      • 问会不会设计模式

        • 溜了溜了

      • 问python的单例模式

        • 不知道

      • 问怎么计算一棵树的深度

        • 答出来一个用递归的

      • 问数据库相关

        • 要实现从一个数据表的数据转移到另一个数据表该怎么实现

          • 我说事务+游标+SELECT+INSERT

        • LEFT JOIN和RIGHT JOIN

          • 这个很稳

  • 小红书

    • 貌似也是一面跪,说实话有点跪的莫名其妙

      • 上来先做了一道编程题,说实话我有点蒙

      • 然后这不第一道做的一般般嘛然后又出了一道简单的写出多种斐波那契数列的方法

        • 写了两种一种是递归另一种是用前两天看的生成器写的

      • 然后问项目,问去年实验室那个项目。。以后还是在简历上删掉这个东西吧

        • 问哦tomcat的默认端口是多少

          • 答8080

        • 怎么看LINUX的状态

          • 答TOP

        • 怎么看一个服务的状态

          • 我说ps得到PID,然后NATSTAT这个PID得到连接状态

        • 问感觉后端的话给移动端和给网站的接口有什么差别

          • 布道

      • 问进程和线程

        • 我说了一堆

        • 然后问我如果一个东西只用单线程会怎么样

          • 我说会慢

          • 感觉对这个答案不满意

  • 好大夫在线

    • 没准儿还有二面感觉

      • 过去先写了1个小时的卷子。。哇11道编程题。。编的我头皮发麻

      • 然后就是面试了先是问python基础。。问的我头皮发麻。。很多细节的知识点

        • super

        • 生成器

        • 感觉主要就是问面向对象相关的

      • 再就是linux相关,比如怎么查看内存啊怎么看硬盘之类的,我发现这几天的面试都爱问这个。。回去把top好好研究一下,还问了怎么批量杀死进程

      • 然后还问了django

        • 一开始问的比较难,问与数据库是怎么交互的,我说了操作,他问我底层是怎么实现的呢

        • 然后发现这方面我比较菜就问了我MVC模式

      • 最后问了点基础,问了网络的七层模型

  • 金山云

    • 口头OFFER拿到,嘿嘿嘿。。这波面试是第一次经历二面和三面,感觉很稳

      • 一面就是纯技术

        • 让做题,做的题目和其他公司的笔试题差不多,包括操作系统、计算机网络、数据结构,编程题也不难就是让写了个快排,然后还详细的讲了一下。

        • 还有就是和面试官详细的讲了一下三次握手和四次挥手,很稳

      • 二面基本就是一半一半了

        • 前面先扯淡,什么兴趣点在哪啊,为什么想做这一行啊之类的,什么哟你本科宇航的啊~我本科就是电子信息的也不是科班的

        • 然后就问了两个技术问题。一个是问内存管理一个是问进程和线程的概念

          • 进程线程回答的无敌

          • 内存管理就有点忘了,就说了说虚拟内存的东西

      • 三面老哥估计就是领导之类的了,因为看着年纪大一点

        • 然后就是大部分时间在扯淡了

        • 后面冷不丁的提出一个开放式的技术问题。问怎么保证分布式数据的一致性

          • 然后我举了个分布式数据库的例子,说可以用日志来记录数据库的修改,然后比对日志就知道是不是一样的了

  • 华为

    • 华为这个就水多了总共两面,技术面+HR面

      • 技术面是一个年轻技术老哥面的

        • 先是介绍项目

        • 再是做两道题

          • 不难,都做出来

        • 再就是我说我自学过操作系统之类的,他就问了我怎么学的但是没考我,然后就是我在他那通过了

        • 感觉自己还没怎么发挥就过了啊

      • HR面就是纯扯淡了

        • 介绍项目问有哪些难点然后怎么解决的

        • 实习的规模多大,做得怎么样

        • 问了问已有哪些OFFER别人给了我多少待遇

          • 这里忘记吹逼了,实话实话了一个白菜价

  • 滴滴

    • 搞了一次视频面试,是一面,后面还有没有后续的得等通知

      • 问项目

      • 问SQL

      • 问C JAVA python有什么不同

      • 问了一道编程题

      • 尽力了,确实感觉要难一些,主要是他没问到我熟悉的python啊基础知识之类的,所以整体看来就是在各种临场发挥,没事儿等结果吧

    • 二面跪

      • 运气不好把也算是,面试官不按套路出牌

        • 问程序在计算机中运行时的全部底层构成,就是堆、栈、程序计数器、寄存器这些的,有点不行了

        • 然后就开始扯淡了,可能是因为第一个问题没答好就放弃了吧,就让我给他说一个学得好的学科知识之类的,这就明显在扯了

  • 度小满金融

    • 过了一面

      • 一面老哥表示我是他面得第一个,基本就是问各种基础,问了半个小时

        • 问计算机网络

          • 三次握手

        • 问操作系统

          • 虚拟内存和物理内存

          • LINUX的内存管理系统

          • 多线程

        • 让写了两道简单的编程题,稳得

    • 然后说二面面试官太忙了就直接让我进行三面了(可能是我比较强直接跳级了哈哈哈)

      • 这个就估计是部门领导了,因为看着年纪比较大,问了半个小时左右

        • 问项目

        • 问HTTP和HTTPS的区别

        • 问了一道智力题:有两个玻璃珠,求最快的方法找到临界的从楼上丢下来不会丢的层数

        • 让写一个归并排序

        • 让说说自己的优缺点

  • 去哪儿

    • 就一面,说是回来等消息,不过我表现得还挺好的说实话应该是真的就一面吧,话说还是个女面试官,挺漂亮的

      • 几乎什么都问了,问了快一个小时

        • 一开始问数据库相关

          • 数据库设计

          • 优化

          • 索引的原理

          • 哈希之类的

        • 然后问数据结构

          • 问堆和栈

          • 问压缩算法——我知道是霍尔夫曼树,但是具体我忘了

        • 让写了堆排序和一道典型的递归的题——无敌

        • 还有很多就是,但我忘了,不过就那些东西吧反正

  • 瓜子二手车

    • 第二次面试了啊这是,第一次是在学校。。说实话发挥的一般,基础部分还可以都答出来了,手撕代码阶段不行了,等结果吧

      • 基础部分问了TCP和UDP、线程

        • TCP的三次握手,为什么是三次

        • TCP和UDP的不同

        • TCP是面向连接的怎么理解

        • 对于线程的理解

      • 让写编程题,结果前两道都没写出来

        • 第一道让找出两个链表的交点

          • 以前研究过,但是忘了

        • 第一道不行让做第二道说是找一棵树里结点和最大的路径

          • 有思路但是具体就没写出来了

        • 最后还是不行就让写个快排

          • 写出来了

  • 马蜂窝

    • 层层闯关经历了三面,两面技术,一面HR聊天,感觉这两次技术面有点懵有点奇怪,没怎么问所谓的计算机和语言基础,狂问项目,和别的公司不像

      • 问了项目用到了什么技术,有哪些问题,怎么解决的

      • 二面中问到了数据库怎么建索引比较好

      • 两面都让写了正则,说实话有点虚

      • 写了不少编程题但是都挺基础的:快排、链表找中间点、判断两棵树是不是镜像

      • git的一些用法,说实话答得也有点虚

      • 说是下周三之前打电话出结果,应该是要是没电话的话就是跪了

  • 字节跳动

    • 能面试就已经很赚了,这么想不错

    • 三面面面都是技术面,操作系统、写代码、网络、数据库,能问的所有都问到了,头条有个显著的特点就是喜欢举个案例让你来分析来设计来解决,这就掐住我的命门了

      • 一面

        • 案例是让给微信的朋友圈评论功能设计后端的数据库

        • 让用一个锁实现共享锁

      • 二面

        • 问基础就还好

      • 三面

        • 各种系统设计问题

        • 写了道链表的题,倒是还行

    • 罢了罢了,头条的这个面试是我经历过的强度最大了,是真的累了,一两周之内出结果,听天由命吧

2018-10-01 16:38:07 weixin_42137700 阅读数 1171

整理 | Jane

出品 | AI科技大本营

 

【导读】9 月,正值 2019 秋季招聘热季,最近身边很多小伙伴都是在笔试、面试中艰难生存着,结果却也是喜忧参半。每一年的情形都在变化,但不变的是竞争在增加,难度在增大。特此,我们专门为大家找了一些面试题或者经验分享。本次给大家推荐的是一份 Python 面试题资源,在 GitHub 上收获了 6519 颗 Star;一份关于笔试面经+ 算法、ML、DL、CV 等笔试面经的总结,在 GitHub 上收获了 近 3k 颗 Star。

 

Part 1

关于 Python 的面试题

 

首先,感谢作者 hackerxu(taizilongxu) 及 16 位 contributors 的公开分享!

 

640?wx_fmt=png

 

接下来,我们看看都包括哪些内容,我们为大家分成了三类:1.关于 Python 这门语言总结的一些重要问题,并给出了示例代码供大家分析理解;2.总结了一些算法的编程题;3.在面试中其他的一些知识点的掌握与阐述;

 

1.关于 Python 的语言特性问题

 

640?wx_fmt=png

 

2.算法编程题

 

640?wx_fmt=png

 

3.知识点阐述问题

 

本部分内容涉及:操作系统、数据库、计算机网络等;

 

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png



 

Part Two

关于笔试面经、 算法、ML、DL、CV ...

 

本文是由 imhuay 和 wendingp 两位作者贡献的,在 GitHub 上也收获了近 3k 颗 Star

 

1.笔试面经:

 

640?wx_fmt=png

 

2.与机器学习、深度学习、计算机视觉与自然语言处理相关

 

640?wx_fmt=png

 

3.算法类问题

 

640?wx_fmt=png

 

希望这些资源对大家有所帮助,都可以收获好结果。

 

GitHub 地址:

https://github.com/taizilongxu/interview_python

https://github.com/imhuay/Algorithm_Interview_Notes-Chinese

 

    

 

--【完】--

--------------------- 本文来自 AI科技大本营 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/82836660?utm_source=copy

2017-08-29 10:18:08 u010035907 阅读数 28801

博文1:pandas.read_csv——分块读取大文件

http://blog.csdn.net/zm714981790/article/details/51375475

今天在读取一个超大csv文件的时候,遇到困难:

  • 首先使用office打不开
  • 然后在python中使用基本的pandas.read_csv打开文件时:MemoryError
  • 最后查阅read_csv文档发现可以分块读取。
  • read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,IO Tools 举例如下:
In [138]: reader = pd.read_table('tmp.sv', sep='|', chunksize=4)

In [139]: reader
Out[139]: <pandas.io.parsers.TextFileReader at 0x120d2f290>

In [140]: for chunk in reader:
   .....:     print(chunk)
   .....: 
   Unnamed: 0         0         1         2         3
0           0  0.469112 -0.282863 -1.509059 -1.135632
1           1  1.212112 -0.173215  0.119209 -1.044236
2           2 -0.861849 -2.104569 -0.494929  1.071804
3           3  0.721555 -0.706771 -1.039575  0.271860
   Unnamed: 0         0         1         2         3
0           4 -0.424972  0.567020  0.276232 -1.087401
1           5 -0.673690  0.113648 -1.478427  0.524988
2           6  0.404705  0.577046 -1.715002 -1.039268
3           7 -0.370647 -1.157892 -1.344312  0.844885
   Unnamed: 0         0        1         2         3
0           8  1.075770 -0.10905  1.643563 -1.469388
1           9  0.357021 -0.67460 -1.776904 -0.968914
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 指定iterator=True 也可以返回一个可迭代对象TextFileReader :
In [141]: reader = pd.read_table('tmp.sv', sep='|', iterator=True)

In [142]: reader.get_chunk(5)
Out[142]: 
   Unnamed: 0         0         1         2         3
0           0  0.469112 -0.282863 -1.509059 -1.135632
1           1  1.212112 -0.173215  0.119209 -1.044236
2           2 -0.861849 -2.104569 -0.494929  1.071804
3           3  0.721555 -0.706771 -1.039575  0.271860
4           4 -0.424972  0.567020  0.276232 -1.087401
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • 我需要打开的数据集是个csv文件,大小为3.7G,并且对于数据一无所知,所以首先打开前5行观察数据的类型,列标签等等
chunks = pd.read_csv('train.csv',iterator = True)
chunk = chunks.get_chunk(5)
print chunk
'''
             date_time  site_name  posa_continent  user_location_country  
0  2014-08-11 07:46:59          2               3                     66   
1  2014-08-11 08:22:12          2               3                     66   
2  2014-08-11 08:24:33          2               3                     66   
3  2014-08-09 18:05:16          2               3                     66   
4  2014-08-09 18:08:18          2               3                     66   
'''
博文2:python大规模数据处理技巧之一:数据常用操作

http://blog.csdn.net/asdfg4381/article/details/51689344

面对读取上G的数据,Python不能像做简单代码验证那样随意,必须考虑到相应的代码的实现形式将对效率的影响。如下所示,对pandas对象的行计数实现方式不同,运行的效率差别非常大。虽然时间看起来都微不足道,但一旦运行次数达到百万级别时,其运行时间就根本不可能忽略不计了:

p1

故接下来的几个文章将会整理下渣渣在关于在大规模数据实践上遇到的一些问题,文章中总结的技巧基本是基于pandas,有错误之处望指正。

1、外部csv文件读写


大数据量csv读入到内存


  • 分析思路:数据量非常大时,比如一份银行一个月的流水账单,可能有高达几千万的record。对于一般性能的计算机,有或者是读入到特殊的数据结构中,内存的存储可能就非常吃力了。考虑到我们使用数据的实际情况,并不需要将所有的数据提取出内存。当然读入数据库是件比较明智的做法。若不用数据库呢?可将大文件拆分成小块按块读入后,这样可减少内存的存储与计算资源
  • 注意事项:open(file.csv)与pandas包的pd.read_csv(file.csv ): python32位的话会限制内存,提示太大的数据导致内存错误。解决方法是装python64位。如果嫌python各种包安装过程麻烦,可以直接安装Anaconda2 64位版本
  • 简易使用方法:
    chunker = pd.read_csv(PATH_LOAD, chunksize = CHUNK_SIZE)
  • 1
  • 1
  • 读取需要的列:
    columns = ("date_time",  "user_id")
    chunks_train = pd.read_csv(filename, usecols = columns, chunksize = 100000)
  • 1
  • 2
  • 1
  • 2

chunker对象指向了多个分块对象,但并没有将实际数据先读入,而是在提取数据时才将数据提取进来。数据的处理和清洗经常使用分块的方式处理,这能大大降低内存的使用量,但相比会更耗时一些

  • 分块读取chunk中的每一行:
    for rawPiece in chunker_rawData:
        current_chunk_size = len(rawPiece.index)   #rawPiece 是dataframe
        for i in range(current_chunk_size ):
            timeFlag = timeShape(rawPiece.ix[i])   #获取第i行的数据
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

将数据存到硬盘


  • 直接写出到磁盘:
    data.to_csv(path_save, index = False, mode = 'w')`
  • 1
  • 1
  • 分块写出到磁盘:
  1. 对于第一个分块使用pandas包的存储IO: 
    • 保留header信息,‘w’模式写入
    • data.to_csv(path_save, index = False, mode = 'w')
  2. 接下的分块写入 
    • 去除header信息,‘a’模式写入,即不删除原文档,接着原文档后继续写
    • data.to_csv(path_save, index = False, header = False, mode = a')
  • 少量的数据写出:

少量的数据用pickle(cPickle更快)输出和读取,非常方便 ,下面分别是写出和读入

写出:

    import cPickle as pickle
    def save_trainingSet(fileLoc, X, y):
        pack = [X, y]
        with open(fileLoc, 'w') as f:
            pickle.dump(pack, f)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

读入:

    import cPickle as pickle
    def read_trainingSet(fileLoc):
        with open(fileLoc, 'r') as f:
            pack = pickle.load(f)
        return pack[0], pack[1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

高效读取外部csv到python内部的list数据结构


  • 效率低下的方法:使用pd读入需要从pd转换到python本身的数据结构,多此一举
    userList = []
    content = pd.read_csv(filename)
    for i in range(len(content)):
        line = content.ix[i]['id']
        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 效率高的方法:直接将外部数据读入进来
    userList = []
    f = open(filename)
    content = f.readlines()
    for line in content:
        line = line.replace('\n', '').split(',')
        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、数据分析时常用数据结构之间的转化


数据集的横向与纵向合并


  • 简单地横向合并数据集:
  • 问题分析: 
    • 纵向的合并使用list并不好,因为需要去拆解list的每一个行元素,并用extend去拓展每一行的纵向元素
    • 最好使用dataframe中的concat函数:c = pd.concat([a, b], axis = 1),当axis=0时表示合并行(以行为轴)
    inx1 = DataFrame(np.random.randn(nSample_neg), columns = ['randVal'])
    inx2 = DataFrame(range(nSample_neg), columns = ['inxVal'])
    inx = pd.concat([inx1, inx2], axis = 1)
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
  • 类似数据库的表合并:join(待完整)
    ret = ret.join(dest_small, on="srch_destination_id", how='left', rsuffix="dest")
  • 1
  • 1
  • 简单纵向合并数据集:
  • 纵向合并数据集可以考虑一下几种方法: 
    • 读取数据为list格式,使用append函数逐行读取
    • 将数据集转换为pandas中的dataframe格式,使用dataframe的merge与concat方法
  • 方法: 
    • 方法一:使用dataframe读入,使用concat把每行并起来
    • 方法二:先使用list读入并起来,最后转换成dataframe
    • 方法三:先使用list读入并起来大块的list,每块list转换成dataframe后用concat合并起来
  • 比较:方法一由于concat的静态性,每次要重新分配资源,故跑起来很慢; 方法二与三:会快很多,但具体没有测试,以下是使用方法三的代码:
    data = []
    cleanedPiece = []
    for i in range(CHUNK_SIZE):
        line = rawPiece.ix[i]
        uid = [line['user_id'], line['item_id'],
            line['behavior_type'], timeFlag]
        cleanedPiece.append(uid)
    cleanedPiece = DataFrame(cleanedPiece, columns = columns)
    data = pd.concat([data, cleanedPiece], axis = 0)



python面经

阅读数 132