python_linux_mysql常见面试题
一、python常用面试题
1.常用排序方法
#!/usr/bin/env python3 #coding: utf-8 ###_______________________________________冒泡排序________________________________________________________________ ''' 反复访问要排序的元素列,并依次比较两个相邻的元素。如果顺序(如从大到小)错了,就交换它们。访问元素的工作是反复进行,直到没有相邻元素需要交换,也就是说元素列已经排序完成。 ''' def bubble_sort(alist): for j in range(len(alist)-1,0,-1):#j倒序,逐渐减小 # j表示每次遍历需要比较的次数,是逐渐减小的 for i in range(j):#j逐渐减小 print('遍历j:{},i:{},元素{},{}'.format(j,i,alist[i], alist[i+1])) #如果前一个元素大于后一个元素,则位置互换 if alist[i] > alist[i+1]: print('前元素大于后元素',alist[i] , alist[i+1]) alist[i], alist[i+1] = alist[i+1], alist[i] print('互换后',alist) li = [54,26,93,17,77,31,44,55,20] bubble_sort(li) print('最终排序结果:',li) ###______________________________________选择排序________________________________________________________________ ''' 首次从待排序的数据元素中选择一个元素,存储在序列的开始位置,然后从剩余的未排序元素中找到最小元素,然后放在已排序的末尾。直到所有元素都被排序 ''' import random as rd def select_sort(): select_list=[22,9,36,56,12] # 数组长度 length = len(select_list) print('初始列表为:',select_list) #length-1是因为最后一轮不用排序 for i in range(length - 1): min_index = i # 第一个元素设置为默认最小值 print('最小值',min_index) #i+1表示不用和自己比较(不加1也不会错) for j in range(i+1, length): print('i=',i) # 如果默认最小值比当前值要大,则把当前值设置为默认最小值 # 如果想把数组排成降序,则把大于号改成小于号就可以。(当前为升序) print(select_list[min_index]) print(select_list[j]) if select_list[min_index] > select_list[j]: min_index = j # 交换位置(这里交换是核心) select_list[min_index], select_list[i] = select_list[i], select_list[min_index] # 打印每一轮的排序情况 print('第{}轮排序是{}'.format(i+1,select_list)) print('最终排好序为:',select_list) if __name__ == '__main__': select_sort() ###_____________________________________插入排序___________________________________________________________________ ''' 对于未排序的数据,通过构建有序的序列,在已排序的序列中从后向前扫描,找到相应的位置并插入。插入式排序在实现上,在从后向前扫描的过程中,需要反复将已排序的元素逐步向后移动,为最新的元素提供插入空间。 ''' def insertionSort(arr): print('初始列表为:',arr) for i in range(1, len(arr)): key = arr[i] #这里是元素 j = i-1 #这里是下标 print('key=',key) print('j=',j) print('arr[j]=',arr[j]) while j >=0 and key < arr[j] : arr[j+1] = arr[j] j -= 1 arr[j+1] = key arr = [12, 11, 13, 5, 6] insertionSort(arr) print('排序后:',arr)
2.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和
def f(n): a = 2.0 b = 1.0 total = 0.0 for i in range(1, n +1): print(i) total += b/a#第一次就是1除以2 a, b = a + b, a #第一次a+b为3(a=2,b=1),第二次a+b为5(a=3,b=2),以此类推 print(total) f(20)
3.写出1到100的累加
def sum(chen): '''数字累加计算''' _sum=0 for i in range(1,chen+1): _sum+=i print(_sum) sum(100)
4.乘法表实现
###______________________________________________简单-可控制层数_________________________________________________________________________ def multiplication_table(number): '通过数字控制-乘法表' if number <=9: for i in range(1,number+1): for a in range(1,i+1): print('{} * {} = {}'.format(a,i,i*a),end='\t') print() else: print('层级不符合规定') multiplication_table(9) ###_______________________________________________简单___________________________________________________________________________________ # for row in range(1, 10): # for col in range(1, row+1): # print('{}*{}={}'.format(col, row, col * row), end='\t') # print() ###______________________________________横向实现(稍微难点)_________________________________________________________________________________ # for j in range(1, 10): #计从1到9,不包括10,而且1-9是连续的range(100)默认0-99 # for i in range(1, j+1): #观察发现乘号左边的数字小于等于右边的数字,i左,j右,一般二层循环的变量小于一层的(非通用) # result = i * j # if i <j: #观察每一行的最后一个式子会发现换行的根据, # print('.{} * {} = {}'.format(i,j,result), end='\t ') # 即,除最后一个式子,左都小于右(i<j),而且连续打印 # # 不换行(所以用end='') # else: #换行的根据是i=j,虽然要换行,但也是打印了之后换行的 # print('{} * {} = {}'.format(i,j,result), ' ') #i不可能大于j,因为i的范围就是range(1, j+1)
5.python理论题
1.列表和字典有什么区别? 1.获取元素的方式不同(列表通过索引值获取,字典通过键获取) 2.数据结构和算法不同(字典是 hash 算法,搜索的速度特别快) 3.占用的内存不同 2.列表(链表)和元组的区别? 1.列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数) 2.元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。 3.如何结束一个进程? 1.调用 terminate 方法即可 2.使用 subProcess 模块的 Popen 方法 4.进程、线程有什么区别?什么情况下用进程?什么情况下用线程? ① 进程之间相互独立,同一进程的各线程之间共享。 ③ 调度和切换:线程上下文切换比进程上下文切换要快得多。 ④ 运行业务需要独立时可使用进程, 业务之间需要变量共享可使用线程 或者需要速度比较高的时候可用线程 5.移动端 UI 自动化,经常会自动安装 2 个程序,你知道那两个程序是什么东西不? 守护精灵,主要保证客户端连接通通畅 6.列表和队列的区别: 列表就相当于一个有底的瓶子先进去的数据最后才出来。而队列就相当于火车站排队买票先进先出。并且只能从队尾进对头出 7.is和==的区别: is是判断内存地址是否相同,==用于判表面值是否相同 有时候==判断是 True ,is 判断却是 False? 这是因为两个字符串来自不同的内存块,内存地址不一样 8.装饰器应用场景: 1,引入日志 2,函数执行时间统计 3,执行函数前预备处理 4,执行函数后清理功能 5,权限校验等场景 6,缓存
二、linux常用面试题
1.、查看python进程并结束进程
#查看进程信息 ps -ef|grep python #结束进程 kill -9 pid
2.linux网络配置
#修改ip地址(立即生效重启失效) ifconfig eth0 ip地址 #修改子网掩码(立即生效重启失效) ifconfig eth network 子网掩码 #配置多ip(临时的重启失效) ifconfig eth1:0 10.10.10.10 netmask 255.255.255.0 up #永久修改ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 #重启network service network restart
3.常用命令
查看类的: uptime -s #查看系统正常的运行时间 lsof -i :6379 #查看某个端口被占用情况 netstat -anp |grep 3306 #查看端口是否被占用 history #查看历史命令记录 ifcofig #查看网络及ip tree #查看当前目录结构 df -hl #查看磁盘使用请情况 ps -aux|grep 应用名 #查看应用的进程 uptime #查看系统运行时间 top #查看系统资源 free -m #查看内存情况(-m表示单位MB、-h表示单位GB) fdisk -l #查看所有分区 telnet IP:端口 #解析链接 文件目录相关查询 tail -f rumenz.log #动态实时查看日志 find -name 文件或目录 #查看找文件或目录 tail -f app.log | grep ERROR # 实时监控错误日志 grep "500" error.log | wc -l # 统计500错误数量 操作类: mkdir filename #创角目录 touch file #创建文件 mv 源路径 目标路径 #移动文件或目录 rm -rf 文件或目录 #删除文件或目录 more 文件 #查看文件 curl 网址 #打开网址 chmod +x 文件#给文件添加执行权限 reboot #重启系统 clear #清屏
三、面试逻辑题
1.一个5升的杯子和一个4升的杯, 要怎样倒水才能使两个杯子的水达到3升
1.5满倒4,把4倒了,把剩余1倒4
2.5满倒4,把4倒了,把剩余2倒4
3.5满倒4,把4倒了,把剩余3倒4
2. 3升和5升的杯子,怎么得到4升水
1.5满倒3,再把3升倒掉 2.把剩余2倒3 3.5满后把3倒满 4.此时5升被子就剩4升
3.一个箱子里有100个彩球,两个人去取球,最少要取1个,最多取5个.如果甲先取,第一次取几个,那最后一个甲一定能取到?
答案为;6 这种题目是考虑倍数的问题。每次最多取5个最少1个,这样的话就考虑每次取6, 100÷6=16余4。 先拿的人拿4个,不论第二个人拿几个,第一个人把他凑成6个,这样永远是第一个人取到最后一个。 第一次取4个,以后每次取的数与另一个人取的数之和为6就行了
浙公网安备 33010602011771号