翻转单词/Maxqueue/二次树的序列化和反序列化

在这里插入图片描述

翻转单词

区别于 https://leetcode.cn/problems/reverse-words-in-a-string/

Reverse.py

class Solution:
    #  翻转字符数组
    def reversestring(self, nums, left, right):
        while left <= right:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1
        return None

    #  翻转每个单词
    def reverse_echo_word(self, nums):
        s = 0
        e = 0
        n = len(nums)
        while s < n:
            while e < n and nums[e] != ' ':
                e += 1
            # e会跳出循环等于n 所以-1
            self.reversestring(nums, s, e - 1)
            # 从下一个单词开始
            s = e + 1
            e += 1
        return None

    def reverseWords(self, s):
        li = list(s)
        self.reversestring(li, 0, len(li) - 1)
        self.reverse_echo_word(li)
        return ''.join(li)


if __name__ == "__main__":
    # s = "hello          world"
    s = "we   are from  China"
    ss = Solution()
    print(ss.reverseWords(s))

Maxqueue.cpp

#include<cstdio>
#include<iostream>
#include<limits.h>
#include<queue>
using namespace std;
class MaxQueue{
	queue<int> a,b;
public:
	MaxQueue(){
	}
	void add(int v)
	{
		a.push(v);
	} 
	int poll()//正常弹出元素 
	{
		int num;
		num = a.front();
		a.pop();
		return num;
	}
	int pollMax()
	{
		int max=INT_MIN,t;
		while(!a.empty())//把队列a压入队列b中,找队列a中最大的元素 
		{
			t = a.front();
			if(t > max)
				max = t;
			a.pop();
			b.push(t);
		}
		while(!b.empty())//除了最大的元素,再把队列b中的元素压入队列a中 
		{
			t = b.front();
			b.pop();
			if(t == max)
				continue;
			a.push(t);
		}
		return max;
	}
};
int main()
{
	MaxQueue queue;
	queue.add(3);
	queue.add(4);
	queue.add(1);
	queue.add(2);
	cout << queue.pollMax() <<endl;
	cout << queue.poll() <<endl;
	cout << queue.pollMax() <<endl;
	cout << queue.poll() <<endl;
	return 0;
}

实习maxqueue

区别于 https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof/
https://blog.csdn.net/ly0724ok/article/details/118966507

import queue
class MaxQueue:

    def __init__(self):
        self.deque = queue.deque()

    def max_value(self) -> int:
        # 辅助栈
        maxv = float('-INF')
        s = queue.deque()
        # 队列不空时,一边更新最大值,一遍加入辅助栈
        if not self.deque:return -1
        while self.deque:
            num = self.deque[0]
            if num > maxv:
                maxv = num
            s.append(num)
            self.deque.popleft()

        while s:
            num = s[0]
            if maxv == num:
                continue
            else:
                self.deque.append(num)
        return maxv

    def push_back(self, value: int) -> None:
        self.deque.append(value)

    def pop_front(self) -> int:
        return self.deque.popleft() if self.deque else -1


q = MaxQueue()
q.push_back(3)
q.push_back(4)
q.push_back(1)
q.push_back(2)

print(q.max_value())
print(q.pop_front())
print(q.max_value())
print(q.pop_front())

二叉树的序列化和反序列化

https://leetcode.cn/problems/h54YBf/

在这里插入图片描述
层序遍历

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Codec:

   from collections import deque

class Codec:
    
    def serialize(self, root):
        if not root:
            return ""
        dq = deque([root])
        res = []
        while dq:
            node = dq.popleft()
            if node:
                res.append(str(node.val))
                dq.append(node.left)
                dq.append(node.right)
            else:
                res.append('None')
        return ','.join(res)

    def deserialize(self, data):
        if not data:
            return []
        dataList = data.split(',')
        root = TreeNode(int(dataList[0]))
        dq = deque([root])
        i = 1
        while dq:
            node = dq.popleft()
            if dataList[i] != 'None':
                node.left = TreeNode(int(dataList[i]))
                dq.append(node.left)
            i += 1
            if dataList[i] != 'None':
                node.right = TreeNode(int(dataList[i]))
                dq.append(node.right)
            i += 1
        return root
 
        

# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Codec:
    def serialize(self, root):

        s = ""
        queue = []
        queue.append(root)
        while queue:
            root = queue.pop(0)
            if root:
                s += str(root.val)
                queue.append(root.left)
                queue.append(root.right)
            else:
                s += "n"
            s += " "  
        print(s)      
        return s

    def deserialize(self, data):
 
        tree = data.split()
        print(tree)
        if tree[0] == "n":
            return None
        queue = []
        root = TreeNode(int(tree[0]))
        queue.append(root)
        i = 1
        while queue:
            cur = queue.pop(0)
            if cur == None:
                continue
            cur.left = TreeNode(int(tree[i])) if tree[i] != "n" else None
            cur.right = TreeNode(int(tree[i + 1])) if tree[i + 1] != "n" else None
            i += 2
            queue.append(cur.left)
            queue.append(cur.right)
        return root


        

# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值