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

本文详细解析了LeetCode中涉及数据结构和算法的题目,包括替换空格、链表逆序、用两个栈实现队列、表示数值的字符串等。通过递归、栈、队列等方法解决,讲解了不同语言如Java、Python和C++的实现细节,并强调了字符串和链表操作中的时间复杂度优化策略。
摘要由CSDN通过智能技术生成

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<Integer> stack = new LinkedList<Integer>()定义一个栈,然后stack.removeLast()出栈存储值。

09 用两个栈实现队列

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

class CQueue:
    def __init__(self):
        # 初始化队列,即两个空栈
        self.A, self.B = [], []
    def appendTail(self, value: int) -> None:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值