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

常见的算法题实践

作者: _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)

相关文章

  • 常见的算法题实践

    常用的算法思想包括:枚举、递归、分治、贪心、试探、动态迭代和模拟等 冒泡排序 快速排序 链表 二分法也称为折半法,...

  • 常见算法题

    1. reserve 让数组反转倒置 2. 排序算法 面试最常考:快速排序和希尔算法 (tips) 原理:如果是想...

  • 常见的算法题

    一、找两个链表的交点 存在集中特殊情况: 1、链表长度相同且没交点 2、链表长度相同有交点 3、长度不同有交点(最...

  • 程序员进阶之算法练习(三十四)LeetCode专场

    前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题:1、2、3题都是Medium的...

  • Python 常见算法题

    打印菱形 打印直角三角 打印等边三角形 打印100以内的斐波那契数列 求10万内的所有素数 猴子吃桃问题 猴子第一...

  • 面试常见算法题

    1.对象转换为数组 2.统计一个字符串出现最多的字母 3.找出下列正数组的最大差值 4.获取数组中最大或者最小值 ...

  • php常见算法题

  • iOS常见算法题

    1、二分查找已知一个有序数组, 和一个 key, 要求从数组中找到 key 对应的索引位置 2、字符串反转 3、有...

  • 程序员进阶之算法练习:LeetCode专场

    前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题:题目1是基于链表的大数加法,既...

  • 程序员进阶之算法练习(三十五)LeetCode专场

    前言 LeetCode上的题目是大公司面试常见的算法题,今天的目标是拿下5道算法题:题目1是基于链表的大数加法,既...

网友评论

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

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