算法工程师14.1——力扣刷题基本题

1 栈、队列

1.1 栈的实现

class Stack:
    def __init__(self):
        self.items = []

    def isEMpty(self):
        return self.items == []

    def push(self,item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()   # 删除最后一个元素

    def peek(self):
        return self.items[len(self.items)-1] # 产看栈顶元素

    def size(self):
        return len(self.items)

1.2 队列的实现

class Queue:
    def __init__(self):
        self.items = []

    def isEMpty(self):
        return self.items == []

    def push(self,item):
        self.items.append(item)

    def pop(self):
        return self.items.pop(0)   # 出队列

    def peek(self):
        return self.items[0] # 产看栈顶元素

    def size(self):
        return len(self.items)

1.3 双向队列

class TwoQueue:
    def __init__(self):
        self.items = []

    def isEMpty(self):
        return self.items == []

    def push(self,item):
        self.items.append(item)

    def headpush(self,item):
        self.items.insert(0,item)

    def pop(self):
        return self.items.pop(0)   # 出队列

    def tailpop(self):
        return self.items.pop()

    def peek(self):
        return self.items[0] # 产看栈顶元素

    def size(self):
        return len(self.items)

1.4 简单括号匹配

在这里插入图片描述
核心思想是遇到左括号就加到列表里,遇到右括号就看遇前面的第一个左括号是否匹配,匹配则移除左括号,不匹配说明括号不匹配

def matches(open,close):
    opens = "([{"
    closes = ")]}"
    return opens.index(open) == closes.index(close)

def parCheck(synbolString):
    balanced = True
    index = 0
    list_stack = []
    while index<len(synbolString) and balanced:
        symbol = synbolString[index]
        if symbol in "([{":
            list_stack.append(symbol)
        elif symbol in ")]}":
            if matches(list_stack[-1],symbol):
                list_stack.pop()
            else:
                balanced = False
        else:
            return None

        #print(index,balanced,symbol)

        index +=1
    if len(list_stack) != 0:
        balanced = False

    return balanced


if __name__ == '__main__':
    str = "{{([][])}()}"
    str = "{{([][])}()"
    str = "{([][])}()"
    print(parCheck(str))

1.5 十进制转换

一直除,直到值为0,每次剩下的余数越往后越处于高位,将余数排列好就行,栈的思想
核心思想就是除以进制数,得到余数,余数从后往前排列
在这里插入图片描述

def baseCov(decnumeber,base):
    digits = "0123456789ABCDEF"
    value = []
    while decnumeber > 0:
        yushu = decnumeber%base
        print(yushu,digits[yushu])
        value.append(digits[yushu])
        decnumeber = decnumeber//base

    result = ""
    index = len(value)-1
    while index>=0:
        result = result+value[index]
        index -=1
    return result


if __name__ == '__main__':
    num = 1293
    print(baseCov(num,16))

1.6 表达式转换(未完成)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.7 后缀表达式求值

在这里插入图片描述
在这里插入图片描述

2 链表

数据项和存放位置没有直接联系,依靠前后项的指引而链接
理解链表最重要的是知道浅拷贝,下面的图片案例展示的一清二楚
链表的实现需要
两个类,链表类和节点类,只用一个节点类也可以
各种方法操作时都需注意头节点特殊对待
在这里插入图片描述

2.1 单向链表(节点和链表两个class,注意头节点和尾节点)

import os

class Node:
    def __init__(self,initdata):
        self.data = initdata
        self.next = None

class UnorderedList:
    def __init__(self):
        self.head = None

    def isEmpty(self):
        return self.head == None

    def remove(self,item):
        current = self.head
        find = False
        pre  = None
        count = 0
        # 如果链表是空的
        if current == None:
            return False

        # 如果第1个就是
        if current.data == item:
            self.head = self.head.next
            return count

        # 如果没有找到,就继续往下走
        while not find and current!=None:
            if current.data == item:
                find = True
                pre.next = current.next
            else:
                pre = current
                current = current.next
                count +=1

        if find == False:
            return find
        else:
            return count

    def add(self,item):
        temp = Node(item)
        # 先给当前的加上
        temp.next = self.head
        # 再给头节点加上
        self.head = temp

    def size(self):
        num = 0
        current = self.head
        while current!=None:
            current = current.next
            num +=1
        return num

    def search(self,item):
        current = self.head
        find = False
        count = 0
        while not find and current!=None:
            if current.data == item:
                find = True
            else:
                current = current.next
                count +=1
        if find == False:
            return find
        else:
            return count


if __name__ == '__main__':
    lista = UnorderedList()
    lista.add(2)
    lista.add(3)
    lista.add(4)
    lista.add(5)
    current = lista.head
    while current!=None:
        print(current.data)
        current = current.next
    print("个数:",lista.size())
    s = lista.search(33)
    a = lista.remove(2)
    print(s,a)

在这里插入图片描述

2.2 双向链表的实现

class Node:
    def __init__(self,initdata):
        self.data = initdata
        self.next = None
        self.pre = None

class UnorderedList:
    def __init__(self):
        self.head = None

if __name__ == '__main__':
    a = UnorderedList()

3 树

非线性结构典型的递归结构

3.1 树的列表实现

在这里插入图片描述

3.2 树的链表实现

一个类

(20)树的三种遍历方式,使用外部函数的方法
(21)树的三种遍历方式,使用类内部函数的方法
(22)二叉堆
(23)二叉查找树
(24)平衡二叉树

4 图

(25)图的实现
(26)词梯问题(最短路径)
(27)骑士周游
(28)广度搜索
(29)深度搜索
(30)最短路径
(31)拓扑排序算法
(32)最小生成树

5 查找排序

(9)顺序查找的while实现
(10)二分查找
(11)二分查找的递归实现

(12)冒泡排序
(13)选择排序
(14)插入排序
(15)希尔排序
(16)归并排序
(17)快速排序

6 递归

6.1

7 动态规划

7.1 动态规划实现博物馆大盗的问题

8 枚举

9 贪心

10 分治

11 最优路径

12 其它

12.1 比较两个单词的组成字符是否一致

在这里插入图片描述

12.2 股票问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问的关键。需要仔细分析目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓码bigdata

如果文章给您带来帮助,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值