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就行了

 

 

 

posted on 2022-01-21 14:25  chen_2987  阅读(101)  评论(0)    收藏  举报

导航