zoukankan      html  css  js  c++  java
  • 四月面试总结

    面试总结

    标签(空格分隔): 面试


    今天面试不会内容:

    • IO模型
    • 读取操作文件
    • 线程进程协程
    • mysql的索引触发器存储过程
    • TCP/IP协议
    • 把字符串转化成数字

    IO模型

    • 阻塞IO
    • 非阻塞IO
    • IO多路复用
    • 信号驱动
    • 异步IO

    --IO多路复用

    文件读取操作

    读取一个大文件比如500M,计算出每一个字的频率,分别把前十频率的求出来。

    def str_count(filename):
        f = open(filename,'r',encoding='utf-8')
        dic = {}
        while True:
            line = f.readline()
            if line:
                for s in line:
                    if s in dic:
                        dic[s]+=1
                    else:
                        dic[s]=1
            else:
                break
        result = sorted(dic.items(), key=lambda k: k[1], reverse=True)
        print(dic)
        print(result)
    
    str_count(r'C:UsersAdministratorDesktop	ext.txt')
    

    英文单词的频率

    '''英文单词出现的频率'''
    def word_count(filename):
        f = open(filename,'r')
        dic = {}
        while True:
            line = f.readline()
            if line:
                line = line.replace(',','')
                line = line.replace('.','')
                line = line.replace('!','')
                line = line.replace(';','')
                line = line.replace('-','')
                str_list = line.split()
                for s in str_list:
                    if s.lower() in dic:
                        dic[s.lower()]+=1
                    else:
                        dic[s.lower()] = 1
            else:
                break
        result = sorted(dic.items(), key=lambda k: k[1], reverse=True)
    
        print(result)
    word_count(r'C:UsersAdministratorDesktopabc'
               r'.txt')
    

    IBM面试总结

    • 什么是定长变量?sizeof是什么意思?
    • Setuptools包的作用是什么,和它类似功能的包是什么?
    • 深拷贝与浅拷贝的原理
    • 是否了解pyobject,说说你的理解?

    下面代码的输出

    列表做参数

    def f(x,l=[]):
        for i in range(x):
            l.append(i*i)
        print(l)
    if __name__ == '__main__':
        f(3)
        f(2,[3,2,1])
        f(4)
        f(2)
        f(2,[1,1])
    	'''输出结果
    	[0, 1, 4]
    	[3, 2, 1, 0, 1]
    	[0, 1, 4, 0, 1, 4, 9]
    	[0, 1, 4, 0, 1, 4, 9, 0, 1]
    	[1, 1, 0, 1]'''
    

    指定文件夹下的所有文件和文件夹

    import os
    
    def traverse(f):
        fs = os.listdir(f)
        for f1 in fs:
            tmp_path = os.path.join(f, f1)
            if not os.path.isdir(tmp_path):
                print('文件: %s' % tmp_path)
            else:
                print('文件夹:%s' % tmp_path)
                traverse(tmp_path)
    
    
    path = r'C:UsersAdministratorDesktop'
    traverse(path)
    

    给定一个升序列表和一个数字n在列表中查找两个数,使它们的和为n,并满足时间复杂度为O(n).

    def two_num(sort_list,n):
        i = 0
        j = -1
        start = sort_list[i]
        end = sort_list[j]
        while start < end:
            start = sort_list[i]
            end = sort_list[j]
            result = start+end
            if result < n:
                i+=1
            elif result > n:
                j-=1
            else:
                return (start,end)
    w = two_num([1,3,4,5,6,9,11],4)
    print(w)
    

    有一个3G大小的文件,文件每行一个string,内容为酒店的id和一个图片的名字,使用“ ”分割

    示例:ht_1023134 + " " + hidfadsfadsfdfadsf2r234523,jpg

    表示的是一个酒店包含的一张图片,统计含有图片数量为[20,无穷大]的酒店id,含有图片数量为[10,20]的酒店id、含有图片数量为[10,5]的酒店id,含有图片数量为[0,5]的酒店id,并将结果输出到文件中

    0-5 + “ ” + id1 + “ ” + id2 + .....

    5-10 + “ ” + id1 + “ ” + id2 + .....

    10-20 + “ ” + id1 + “ ” + id2 + .....

    20-无穷大 + “ ” + id1 + “ ” + id2 + .....

    from collections import Counter
    count_dict = {}
    cou = Counter()
    with open('a.txt', encoding='utf-8') as f:
        for line in f:
            hotel, image = line.split()
            hotel_id = hotel.split('_')[1]
            cou.update({hotel_id,1})
            if hotel_id in count_dict:
                count_dict[hotel_id] += 1
            else:
                count_dict[hotel_id] = 1
    del cou[1]
    zero_five = ['0-5']
    five_ten = ['5-10']
    ten_twenty = ['10-20']
    twenty_infinite = ['10-去穷大']
    for hotel_id,count in count_dict.items():
        if count < 5 :
            zero_five.append(hotel_id)
        elif count < 10 :
            five_ten.append(hotel_id)
        elif count < 20:
            ten_twenty.append(hotel_id)
        else:
            twenty_infinite.append(hotel_id)
    with open('b.txt','w',encoding='utf-8') as b:
        b.write('	'.join(zero_five))
        b.write('
    ')
        b.write('	'.join(five_ten))
        b.write('
    ')
        b.write('	'.join(ten_twenty))
        b.write('
    ')
        b.write('	'.join(twenty_infinite))
    

    找到一个目录下,所有以'我'开头的。文件名包含今天的日期文件(yyyy--mm--dd)。文件编码均为utf-8。

    不用内置方法求最大值

    def max_num(li):
        max_n = False
        for i in range(len(li)-1):
            if li[i]>li[i+1]:
                max_n = li[i]
            else:
                max_n = li[i+1]
        return max_n
    n = max_num([1,5,4,7,2])
    print(n)
    

    字符串的编辑距离

    def minDistance(word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        M = len(word1)
        N = len(word2)
        output = [[0] * (N + 1) for i in range(M + 1)]
        for i in range(M + 1):
            for j in range(N + 1):
                if i == 0 and j == 0:
                    output[i][j] = 0
                elif i == 0 and j != 0:
                    output[i][j] = j
                elif i != 0 and j == 0:
                    output[i][j] = i
                elif word1[i - 1] == word2[j - 1]:
                    output[i][j] = min(output[i - 1][j - 1], output[i - 1][j] + 1, output[i][j - 1] + 1)
                else:
                    output[i][j] = min(output[i - 1][j - 1] + 1, output[i - 1][j] + 1, output[i][j - 1] + 1)
        return output[M][N]
    
    
    
    if __name__ == "__main__":
    
    
        l = minDistance('asd', 'asdf')
        print(l)
    

    二叉树遍历获取某值的所有对象集合

    # Definition for a binary tree node.
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    class Solution(object):
        note_obj_list = []
        def note_list(self, root):
            """
            :type root: TreeNode
            :type sum: int
            :rtype: int
    
            """
    
            if not root:
                return None
            else:
                if root.val == 'root':
                    self.note_obj_list.append(root)
                self.note_list(root.left)
                self.note_list(root.right)
    
    
    
    
    root = TreeNode('root')
    root.left = TreeNode('root')
    s = Solution()
    s.note_list(root)
    print(s.note_obj_list)
    

    ASCII码、utf-8与unicode之间的关系

    因为计算机只能处理数字,如果处理文本必须把文本转化成数字才行。最早的计算机设计时采用8个比特位(bit)作为一个字节(byte)

    由于计算技术美国人发明的,因此最早只有127个字母被编码到计算机中,也就是大小写的英文字母、数字、符号,这个编码表被称之为ASCII码表:

    但要处理中文显然是不够的,至少需要2个字节(byte),而且不能和ASCII码冲突,所以中国制定了GB2312

    但是全世界有成百上千种语言,各国之间都有各自的标准,不可避免的会造成冲突,结果是相互转码的都是乱码

    Unicode应运而生,Unicode把所有语言都统一到一套编码里,这样就不会有乱码的问题了。

    Unicode通常用两个字节表示一个字符(生僻字符,就需要4个字节)
    现代大多数操作系统和编程语言都直接支持Unicode。

    新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

    所以又出现了把Unicode编码转化为可变长编码的utf-8编码。UTF-8编码把一个Unicode字符根据不同的字符大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

    字符 ASCII Unicode UTF-8
    A 01000001 00000000 01000001 01000001
    x 01001110 00101101 11100100 10111000 10101101

    从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

    搞清楚了ASCII、Unicode、和utf-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

    在计算机内存中统一使用使用Unicode编码,当需要保存到硬盘或者传输时,就转换成UTF-8编码。

    用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

    将字符转化成数字

    #ASCII码转换为相应字符
    chr(97)
    #字符转换为响应ASCII码
    ord('a')
  • 相关阅读:
    golang基础之第一个go程序
    golang基础之工程结构
    golang基础之初识
    Prometheus神器之监控K8s集群
    Kubernetes使用GlusterFS实现数据持久化
    Go使用Makefile构建
    快排的2种分区图解
    密钥交换之DH算法
    go mod使用
    socket常见选项之SO_REUSEADDR,SO_REUSEPORT
  • 原文地址:https://www.cnblogs.com/ldq1996/p/8747330.html
Copyright © 2011-2022 走看看