leetcode图解算法数据结构---数据结构

leetcode图解算法数据结构---数据结构

      • 05 替换空格
      • 06 从尾到头打印链表
      • 09 用两个栈实现队列
      • 20 表示数值的字符串
      • 24.翻转列表,输出新列表的头节点
      • 30 包含 min 函数的栈
      • 35. 复杂链表的复制
        • 35.1 DFS:通过递归拷贝所有next节点和random节点,用字典存储
        • 35.2 哈希表方式
        • 35.3 拼接+拆分
      • 58 [II. 左旋转字符串](https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/58eckc/)
      • 59 I. 滑动窗口的最大值
      • 59 II. 队列的最大值
      • 67. 把字符串转换成整数
  • 20 59 67 三道题理解收尾;其余题目回顾复习

05 替换空格

解题思路:
字符串是不可变类型,本题中需要替换字符串中的某个字符,可以使用replace方法直接替换;以下是遍历字符串的方式进行求解的,逐个判断字符串中的字符是否为空,若为空,将新字符串添加相应字符串;否则添加原来字符。该方法的时间复杂度为o(n)

代码:

class Solution:
    def replaceSpace(self, s: str) -> str:
    	# return s.replace(' ', '%20')
        tmp = ''
        for i in range(len(s)):
            tmp += '%20' if s[i] == ' ' else s[i]
        return tmp
class Solution {
   
    public String replaceSpace(String s) {
   
        StringBuilder res = new StringBuilder(); // 可变的字符串对象,没有线程安全
        for(Character c : s.toCharArray()){
    // for写法,字符串转字符列表
            if(c == ' '){
   res.append("%20");} // 双引号
            else{
   res.append(c);}
        }
        return res.toString();
    }
}

在Java和python3中,string都是不可变类型,需要增加新变量来得到最后的结果。而C++是可变类型,通过s.resize()可以改变字符串长度,按照空格数改变字符串长度,然后从后往前寻找空格,往相应地方添加题目中要求的字符。

class Solution {
   
public:
    string replaceSpace(string s) {
   
        // 首先先确定空格的数量,然后更改字符串的长度,用两个指针从后往前遍历,如果遇到空格,从后往前将20%写上
        int len = s.size();
        int count = 0;
        for(char c : s){
   
            if(c == ' '){
    // C++中单字符用单引号
                count++;
            }
        }
        s.resize(len + count * 2);
        for(int i=len-1,j=s.size()-1;i<j;j--,i--){
   
            if(s[i] == ' '){
   
                s[j] = '0';
                s[j-1] = '2';
                s[j-2] = '%';
                j -= 2;
            }else{
   
                s[j] = s[i];
            }
        }
        return s;
    }
};

06 从尾到头打印链表

我的思路就是逐个读取链表节点的value得到一个list,然后逆序输出list即可,时间复杂度和空间复杂度都是o(n)

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        result = []
        # 正序读取O(n)
        while head is not None: # 可以简写为:while head:
            result.append(head.val)
            head = head.next
        # list逆序输出,下标操作
        return [result[len(result)-i-1] for i in range(len(result))]
        # python中list逆序可以直接通过切片实现
        # return result[::-1]

解题方法:

  • 递归回溯法:
    若head不是空,那么逐个遍历链表,直到head为空时,再依次回溯回去。在python的代码中,我认为self.reversePrint()本身就是一个递归的机制,表示求某条链表的逆序。
return self.reversePrint(head.next) + [head.val] if head else []
  • 辅助栈法:
    由于本题是单链表,需要逆序输出值,考虑到栈先进后出的原则,考虑用栈来解决此题。以上我的思路就是这种方法,在python中,使用list就足够。在Java中,需要使用LinkedList stack = new LinkedList()定义一个栈,然后stack.removeLast()出栈存储值。

09 用两个栈实现队列

首先,明确队列和栈的工作方式。队列是“先进先出”,栈是“先进后出”。本题需要完成两个功能,分别是添加和删除,即往队尾添加新元素,删除队首的元素。如果用一个栈来完成队列的操作,添加元素时,直接添加即可;删除元素时,弹出最后一个值(栈底元素)就需要逐个弹出所有元素。那么可以用一个栈完成添加操作,另一个栈逆序存储列表顺序,完成删除操作。在python中,可以直接用list作为栈。

class CQueue:
    def<

你可能感兴趣的:(基础算法)