美文网首页
常见的算法题实践

常见的算法题实践

作者: _karen | 来源:发表于2020-08-21 15:32 被阅读0次

    常用的算法思想包括:枚举、递归、分治、贪心、试探、动态迭代和模拟等

    • 冒泡排序
    # 算法复杂度:最坏:(n**2)  最好:O(n) 稳定
    def bubble_sort(alist):
        n = len(alist)
        for i in range(n):
            for j in range(0,n-i-1):
                if alist[j]>alist[j+1]:
                    alist[j],alist[j+1]=alist[j+1],alist[j]
        return alist
    
    arr = [64, 34, 25, 12, 22, 11, 90]
    new_arr = bubble_sort(arr)
    print(new_arr)
    
    • 快速排序
    
    # 快速排序
    def quickly_sort(alist,start,end):
    
        # 递归的出口
        if start>=end:
            return
        low = start
        high = end
        key = alist[start]
    
        while low<high:
            # 1.从右侧开始找比基准元素小的,放到左侧
            while  low<high and alist[high]>key:
                high = high - 1
    
            alist[low]=alist[high]
    
    
            # 2.从左侧开始找比基准元素大的,放到右侧
            while low<high and alist[low]<=key:
                low = low + 1
    
            alist[high]=alist[low]
    
        # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
        alist[low]=key
    
        # 对基准元素左边的子序列进行快速排序
        quickly_sort(alist,start,low-1)
    
        # 对基准元素右边的子序列进行快速排序
        quickly_sort(alist,low+1,end)
    
        return alist
    
    if __name__ == '__main__':
        a = [49,38,65,97,76,13,27,49,10]
        print(a)
        new_a = quickly_sort(a,0,len(a)-1)
        print(new_a)
    
    • 链表
    # 结点类
    class Node(object):
    
        # 初始化链表
        def __init__(self,value):
            self.value = value
            self.next = None
    
        # 获取结点数据
        def get_data(self):
            return self.value
    
        # 更新结点数据
        def set_data(self, new_value):
            self.value = new_value
    
        # 获取指针
        def get_next(self):
            return self.next
    
        # 更新指针
        def set_next(self,new_next):
            self.next = new_next
    
    
    # 链表的主要功能包括:节点的增加、删除和查询,返回链表的长度,返回链表是否为空等。
    # 链表类 单链表
    class ListNode(object):
        def __init__(self,node=None):
            self.__head = node
    
        # 获取头指针
        def get_head(self):
            return self.__head
    
    
        # 获取链表的长度
        def length(self):
            cur  = self.__head
            count = 0
            while cur is not None:
                cur = cur.next
                count += 1
            return count
    
        def traverse(self,link_encode):
            cur = link_encode
            while cur is not None:
                print(cur.value, end=' ')
                cur = cur.next
            print('')
    
    
        # 节点的增加 从头部增加
        def head_add(self,value):
            new_node = Node(value)
            new_node.next=self.__head
            self.__head=new_node
    
    
        # 节点的增加 从尾部增加
        def tail_add(self,value):
            new_node = Node(value)
            cur = self.__head
            if cur is None:
                self.head_add(value)
            else:
                while cur.next is not None:
                    cur=cur.next
                cur.next=new_node
                new_node.next=None
    
    
        # 节点的增加 从中间增加
        def middle_add(self,value,pos):
            new_node = Node(value)
            if pos<=0:
                self.head_add(value)
            else:
                cur = self.__head
                for i in range(pos-1):
                    cur=cur.next
                new_node.next = cur.next
                cur.next = new_node
    
    
    
        # 遍历输出链表
        def travel(self):
            cur = self.__head
            while cur is not None:
                print(cur.value,end=' ')
                cur = cur.next
            print('')
    
    • 二分法
      也称为折半法,是一种在有序数组中查找特定元素的搜索算法
    # 二分法查找的思路如下:
    # (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
    # (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
    # (3)如果某一步数组为空,则表示找不到目标元素。
    # 二分法查找的时间复杂度O(logn)。
    import math
    
    
    def dichotomy(alist,key):
        low = 0
        high = len(alist)-1
        if high<0:
            print("数组为空")
            return
        while low<=high:
            mid=(math.floor((low+high)/2))
            if key==alist[mid]:
                return mid+1,alist[mid]
            elif key<alist[mid]:
                high=mid-1
            elif key>alist[mid]:
                low=mid+1
        else:
            print("数组中没有该元素")
            return
    
    a = [1,2,3,4,5,6,7,8,9]
    res,tmp = dichotomy(a,0)
    print("数组中第",res,"个元素是要查找的值,值为",tmp)
    
    • 二叉树遍历
    • 字符串统计
    str_a = "aabbbcccccccccccddddddddddddddddddddddddddd"
    l = list(str_a)
    print("出现的次数是:",l.count('d'))
    
    • 字符串反转
    # 方法一 函数
    def reverse_s(s):
        return s[::-1]
    str_a = 'Hello'
    print(reverse_s(str_a))
    
    # 方法二 先转列表再reverse再转回字符串
    l = list(str_a)
    l.reverse()
    # 列表转字符串
    print(''.join(l))
    
    • 实现斐波那契数列(递归的典型应用)
    # 递归
    # 1) 递归是在函数本身调用函数本身。
    # 2) 递归的效率比较低,如果有时间限制不建议使用。
    # 3) 递归过程中需要有一个明确的结束条件,即递归出口。
    
    # 斐波那契数列的递推公式为F(n)=F(n-1)+F(n-2),
    # F(1)、和F(2)为1,我们可以通过递归来求解斐波那契数列中的某一项的值为多少。
    
    def fibonacci(n):
        if n<=0:
            return 
        f = [1,1]
        for i in range(2,n):
            f.append(f[i-1] + f[i-2])
        return f[n-1]
    
    print(fibonacci(7))
    
    • 汉诺塔问题(递归)
      i = 1
    def move(n,fr,to):
        global i
        print('这是第%d步:把%d号盘子从%s移动到%s'%(i,n,fr,to))
        i += 1
    def hanoi(n,a,b,c):
        if n == 1:
            move(1,a,c)
        else:
            hanoi(n-1,a,c,b)
            move(n,a,c)
            hanoi(n-1,b,a,c)
    if __name__ == '__main__':
        n = int(input('输入A上面盘子的数量:'))
        print('移动开始')
        hanoi(n,'A','B','C')
    
    • 水仙花数
    # 所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。
    # 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。
    count=0
    for i in range(100,1000):
        a = int(i/100)  # 取第一位
        b = int(i/10%10)   # 取第二位
        c = int(i%10)  # 取最后一位
    
        if i == (a**3 + b**3 + c**3):
            count = count + 1
            print("第", count,  "个水仙数:" ,i)
    

    相关文章

      网友评论

          本文标题:常见的算法题实践

          本文链接:https://www.haomeiwen.com/subject/sgyujktx.html