zoukankan      html  css  js  c++  java
  • 经典算法题总结

    第一题:递归

      1.给一个dict或者json 求 value大于53 并且为int 将该value 转换为str

      

    mydict1 = {"a":{"a":[1,2,3]},
              "b":{"b":1}}
    
    
    def Foo(mydict):
    
        for _,v in mydict.items():
            if isinstance(v,dict):
                Foo(v)
    
            elif isinstance(v,int) and ord(v) > 53:
                v = str(v)
    
            elif isinstance(v,list):
                for i in v :
                    Foo(i)
            elif isinstance(v,tuple):
                for i in v:
                    Foo(i)
    

      

    第二题:逻辑

      2. 给一个数组 [7,3,5,6,4]  最大值不能在比他小的值前面,求最大值和最小值的差?

    a = [7,3,5,6,4]
    
    big = 0
    small = 0
    index = 0
    for i in a:
        if small == 0:
            small = i
        if i > big:
            if index+1 == len(a):
                if i > big:
                    big = i
            elif i > a[index+1]:
                pass
            else:
                big = i
    
        if i < small:
            small = i
        index += 1 #0 1 2
    
    over = big - small
    
    print(over)
    

     按照这种姿势求:

      

    第三题:python生成器

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    i = [1,2,3,4]
    
    u = (j for j in i)
    
    #通过列表生成式,变成了个生成器
    
    print(u,type(u))
    
    """
    <generator object <genexpr> at 0x10457af10> <class 'generator'>
    """
    

    第四题:单例模式

    import threading
    
    import time
    class singleclass(object):
        _instance_lock = threading.Lock()
    
        def __init__(self):
            time.sleep(1)  #加入sleep之后就看出来内存地址不一致,这种情况需要考虑加锁解决
    
        @classmethod
        def instance(cls,*args,**kwargs):
            if not hasattr(singleclass,"_instance"):
                with singleclass._instance_lock:
                    if not hasattr(singleclass,"_instance"):
                        singleclass._instance = singleclass(*args,**kwargs)
            return singleclass._instance
    
    
    def task():
        obj = singleclass.instance()
        print(obj)
    
    for  i in range(100):
        t = threading.Thread(target=task)
        t.start()
    

     基于装饰器的单例模式:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import threading
    
    def Singleton(cls):
        _instance_lock = threading.RLock()
        _instance = {}
        def _singleton(*args,**kwargs):
            if cls not in _instance:
                with _instance_lock:
                    _instance[cls] = cls(*args,**kwargs)
    
            return _instance[cls]
        return _singleton
    
    
    @Singleton
    class A(object):
        a = 1
    
        def __init__(self, x=0):
            self.x = x
    
    
    a1 = A(2)
    a2 = A(3)
    print(id(a1))
    
    print(id(a2))
    
    print(a1.x)
    
    print(a2.x)
    

    代码解析:

    代码分析:第1行,创建外层函数singleton,可以传入类
    
         第2行,创建一个instances字典用来保存单例
    
           第3行,创建一个内层函数来获得单例
    
           第4,5,6行, 判断instances字典中是否含有单例,如果没有就创建单例并保存到instances字典中,然后返回该单例
    
           第7行, 返回内层函数get_instance
    
      #创建一个带有装饰器的类
    
      @singleton
    
      class Student:
    
        def __init__(self, name, age):
    
          self.name = name
    
          self.age = age
    
    在Python中认为“一切皆对象”,类(元类除外)、函数都可以看作是对象,既然是对象就可以作为参数在函数中传递,我们现在来调用Student类来创建实例,看看实现过程。
    
    #创建student实例
    
    student = Student(jiang, 25)
    
    @singleton相当于Student = singleton(Student),在创建实例对象时会先将 Student 作为参数传入到 singleton 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。
    
    此时可以看作Student = get_instance,创建实例时相当于student = get_instance(jiang, 25),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回,如果不在执行 instances [cls] = Student(jiang, 25),然后返回该实例对象并赋值非student变量,即student = instances[cls]。
    

    第五题 super解析:

    class BaseResponse(object):
        def __init__(self):
            print(123)
    
    class LikeResponse(BaseResponse):
    
        def __init__(self):
            self.code = 0
            super(LikeResponse,self).__init__()
            #执行父类的__init__()方法
        
    
    
    if __name__ == '__main__':
        g = LikeResponse()
    
    
    """
    123
    
    """
    

      

    第六题 linux shell 脚本中冒号的意思(:)

    : 在shell里是什么都不做,但返回值为真
    例如
    while :; do
        command
    done
     
    或者
     
    for i in `seq 1 10`; do
        :
    done
    此处相当于python里的pass
    

      

    第七题: linux shell脚本中 

    ETCD_NAME=${1:-"default"} #如果$1没传递数据 默认值就是default
    ETCD_LISTEN_IP=${2:-"0.0.0.0"}
    ETCD_INITIAL_CLUSTER=${3:-}
    

    第八题:python 列表引用类型

    def f(x,l=[]):
        for i in range(x):
            l.append(i*i)
        print(l)
    
    f(2)
    f(3,[1,2,3])
    f(3)
    
    
    """
    [0, 1]
    [1, 2, 3, 0, 1, 4]
    [0, 1, 0, 1, 4]
    """
    

      

     第九题:二分查找非递归方法

    二分查找:
    我们手里有一个长度为n的正序数列,当我们想查找一个数 x是否在这个数列当中的时候
    1 取数列正中间的数mid,
    如果mid和x相等,则找到结果,查找成功 返回True
    如果mid比x大,则x应该在mid的左侧,我们把mid左侧当作一个新的数列li
    如果mid比x小,则x应该在mid的右侧,我们把mid右侧当作一个新的数列li
    2 对于新的数列li 进行1的查找工作

    3 一直重复上面查找,生成新的数列li为空的时候则 数列当中没有数x 返回False

    时间复杂度:最优O(1) 我们取第一次中间数mid 找到了 这种概率很低
    最坏O(log n) 假设n个数的数列,每次把数列分成两半,n除以多少次2 等于1 呢? log n次

    递归实现二分法查找
    #递归实现二分查找 li是列表   item是要查找的元素
    def merge_search( li ,item ):
        #传来的列表每次都是新生成的,如果发现里面没有元素,则是查找到尽头都没找到
        if not li :
            return False
    
        mid = len(li)//2   #mid记录li的中间位置
        #检查一下 如果中间这个数就是要找的元素 返回真
        if li[mid] == item :
            return True
        # 如果mid比item大,说明item可能会出现在mid左边,对左边再查找
        elif li[mid]> item :
            return merge_search( li[:mid] ,item )
        # mid 比item小,说明item有可能在mid右边,对右边再查找
        else :
            return merge_search( li[mid+1:] , item )
    
    if __name__ == '__main__':
        li = [1,2,3,4,5,6,7]
        print( merge_search(li , 0) )   #False
        print( merge_search(li , 1) )   #True
    

      

     非递归查询

    def merge_search( li , item ):
        #获取li的开始 结束
        start = 0
        end = len(li)-1
    
        #只要start和end 还没错开 就一直找
        while start <= end :
            #通过计算获取当前查找范围的中间位置
            mid = (start + end)//2
            #如果中间数就是item则返回True
            if li[mid] == item :
                return True
            #如果mid比item大,说明item可能会出现在mid左边,对左边再查找
            elif li[mid]> item :
                end = mid - 1
            # mid 比item小,说明item有可能在mid右边,对右边再查找
            else :
                start = mid + 1
        #跳出循环说明没找到 返回错误
        return False
    
    if __name__ == '__main__':
        li = [1,2,3,4,5,6,7,8]
        print( merge_search(li , 8) ) #True
        print( merge_search(li , 0) ) #False
    

      

     算法题:

    两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

    import itertools
     
    for i in itertools.permutations('xyz'):
        if i[0] != 'x' and i[2] != 'x' and i[2] != 'z':
            print('a vs %s, b vs %s, c vs %s' % (i[0], i[1], i[2]))
    

    求一个字符串最长不重复子串

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    
    def max_string(st):
        # 设置一个result list + 一个max
        # 考察的问题,如果对中间list 进行截取,这个时候要考虑,我截取完的list
        # 要将新数据append进去,然后在去求一下,长度和max去比较,只有大于max才可以存到最终的结果里
        tmp = []
        result = []
        max_len = 0
    
        for i in st:
            if i in result:
                if result.index(i) == len(result) -1:
                    result = []
                    result.append(i)
                    if len(result) > max_len:
                        max_len = len(result)
                        tmp = result
                else:
                    result = result[result.index(i)+1:]
                    result.append(i)
                    if len(result) > max_len:
                        max_len = len(result)
                        tmp = result
            else:
                result.append(i)
                if len(result) > max_len:
                    max_len = len(result)
                    tmp = result
        print(tmp)
    
    
    if __name__ == '__main__':
        st = "abcadefdhigkg"
        max_string(st)
    
    """
    output
    ['e', 'f', 'd', 'h', 'i', 'g', 'k']
    
    """
    

      

    一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 

    思路:可以将所有数字进行异或,因为相同数字异或之后结果为0,任何数与0异或得该数字本身。此题中将所有数字进行异或的结果就是需要找的那个数字。

    #include <stdio.h>
    #include <windows.h>
    int main()
    {
        int arr[] = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0 };
        int num = arr[0];
        int i = 0;
        for (i = 1; i < sizeof(arr) / sizeof(arr[0]);i++)
        {
            num ^= arr[i];      //整体异或
        }
        printf("different number is %d
    ", num);
        system("pause");
        return 0;
    }

     

    给定一个二叉树,在树的最后一行找到最左面的值

     

  • 相关阅读:
    swift mac 使用git, 并使用osc, 打开当前目录命令在终端输入 open . windows 下为start .
    压力测试-jmeter
    nginx在线与离线安装
    数据库架构简要解析
    maven-build-downloading
    springboot-权限控制shiro(二)
    mysql8报错解析
    springboot-权限控制shiro(一)
    pycharm问题解析(connecting to console)
    springboot-热部署Jrebel
  • 原文地址:https://www.cnblogs.com/liujiliang/p/9176961.html
Copyright © 2011-2022 走看看