LeetCode剑指offer题目记录3

leetcode刷题开始啦, 每天记录几道题.

目录

  • 剑指offer 05. 替换空格
    • 题目描述
    • 思路
      • python
      • C++
  • 剑指offer 06. 从尾到头打印链表
    • 题目描述
    • 思路1
      • python
    • 思路2
      • python
      • C++

剑指offer 05. 替换空格

题目描述

让我们实现一个函数, 把字符串 s 中的每个空格替换为 %20.

思路

这个题目我只能想到遍历, 在空间控制上应该有原地修改的办法会省一些.

python

如果用python, 那直接用split一类的命令就可以了. 但没有必要, 我们直接遍历, 效果也差不多.

class Solution:
    def replaceSpace(self, s: str) -> str:
        result = ""
        for i, char in enumerate(s):
            if char == ' ':
                result += "%20"
            else:
                result += char

        return result

C++

C++的字符串也支持+这个操作, 所以也是类似的.

class Solution {
public:
    string replaceSpace(string s) {
        string result = "";
        for (int iter=0; iter < s.size(); iter++){
            if (s[iter] == ' '){
                result += "%20";
            }
            else{
                result += s[iter];
            }
        }
        return result;
    }
};

时间复杂度是 O ( n ) O(n) O(n), 因为要遍历整个字符串; 空间复杂度是 O ( n ) O(n) O(n), 存储原字符串, 和新建一个字符串.

剑指offer 06. 从尾到头打印链表

题目描述

输入一个链表的头节点, 从尾到头反过来返回每个节点的值(用数组).

思路1

一个想法是反转链表, 再顺序给出每个节点的值. 进一步想, 如果递归的方式反转链表, 就要先走到链表的尾部再从尾到头接上, 那何不在第二个过程里直接返回值呢. 再进一步想, 那何不直接用递归的方式呢?

  1. 基线条件: 如果没有节点, 那直接返回空数组; 如果只有一个节点, 那直接返回这个节点的值.
  2. 递归条件: 如果当前节点之后的链表都已经从尾到头打印到一个数组里了, 那当前节点要做什么呢? 自然是把自己的值扔到这个数组的最后.

python

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        if head == None:
            return []
        if head.next == None:
            return [head.val]
        else:
            return self.reversePrint(head.next) + [head.val]

思路2

我一定不用递归, 那怎么办? 可以用栈, 先进后出, 顺序读链表每个元素, 压入栈, 再把栈里的元素一个个弹出来.

python

python 没有栈的数据结构, 我们可以用两个数组来自己完成.

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        result = []
        
        if head == None:
            return result

        temp = []
        while head != None:
            temp.append(head.val)
            head = head.next
        while temp:
            result.append(temp.pop())
        return result

C++

C++有栈这个数据结构stack, 我们可以直接用一下.

class Solution {
public:
    vector reversePrint(ListNode* head) {
        vector result;
        if (head == NULL){
            return result;
        }
        stack temp;
        while (head != NULL){
            temp.push(head->val);
            head = head->next;
        }
        while (!temp.empty()){
            result.push_back(temp.top());
            temp.pop();
        }
        return result;
    }
};

这个时间复杂度是 O ( n ) O(n) O(n), 两次遍历; 空间复杂度也是 O ( n ) O(n) O(n), 要开辟两个和链表等长的空间.

你可能感兴趣的:(LeetCode记录,学语言,c++,leetcode,哈希算法)