Golang每日一练(leetDay0043)

news2024/9/22 3:29:44

目录

127. 单词接龙 Word Ladder  🌟🌟🌟

128. 最长连续序列 Longest Consecutive Sequence  🌟🌟

129. 求根节点到叶节点数字之和 Sum Root-to-leaf Numbers  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


127. 单词接龙 Word Ladder

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk

  • 每一对相邻的单词只差一个字母。
  •  对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
  • sk == endWord

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。

示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord "cog" 不在字典中,所以无法进行转换。

提示:

  • 1 <= beginWord.length <= 10
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 5000
  • wordList[i].length == beginWord.length
  • beginWordendWord 和 wordList[i] 由小写英文字母组成
  • beginWord != endWord
  • wordList 中的所有字符串 互不相同

相关:

126. 单词接龙 II Word Ladder II  🌟🌟🌟

代码1: BFS

package main

import (
	"fmt"
)

func ladderLength(beginWord string, endWord string, wordList []string) int {
	wordSet := make(map[string]bool) // 存储单词表中的单词,用于删除操作
	for _, word := range wordList {
		wordSet[word] = true
	}
	if !wordSet[endWord] {
		return 0 // 单词表中不包含结束单词,无法进行转换
	}
	visited := make(map[string]bool) // 存储已访问过的单词
	visited[beginWord] = true
	queue := []string{beginWord} // 存储待遍历的节点
	level := 1                   // 存储当前节点所处的层数,即转换序列的长度
	for len(queue) > 0 {
		size := len(queue)
		for i := 0; i < size; i++ {
			currWord := queue[0]
			queue = queue[1:]
			if currWord == endWord {
				return level // 找到了最短路径,返回转换序列的长度
			}
			for _, nextWord := range getNextWords(currWord, wordSet) {
				if !visited[nextWord] {
					visited[nextWord] = true
					queue = append(queue, nextWord)
				}
			}
		}
		level++ // 当前层的所有节点遍历完后,转换序列长度加 1
	}
	return 0 // 无法进行转换
}

// 获取与当前单词相差一个字母的单词列表
func getNextWords(word string, wordSet map[string]bool) []string {
	words := make([]string, 0)
	for i := 0; i < len(word); i++ {
		for j := 'a'; j <= 'z'; j++ {
			if byte(j) == word[i] {
				continue // 将当前字母跳过,避免重复
			}
			newWord := word[:i] + string(j) + word[i+1:]
			if wordSet[newWord] {
				words = append(words, newWord)
				delete(wordSet, newWord) // 将该单词从单词表中删除,避免重复遍历
			}
		}
	}
	return words
}

func main() {
	beginWord, endWord := "hit", "cog"
	wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
	wordList = []string{"hot", "dot", "dog", "lot", "log"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
}

代码2: 双向 BFS

package main

import (
	"fmt"
)

func ladderLength(beginWord string, endWord string, wordList []string) int {
	wordSet := make(map[string]bool) // 存储单词表中的单词,用于删除操作
	for _, word := range wordList {
		wordSet[word] = true
	}
	if !wordSet[endWord] {
		return 0 // 单词表中不包含结束单词,无法进行转换
	}
	visited := make(map[string]bool) // 存储已访问过的单词
	visited[beginWord] = true
	visited[endWord] = true
	queue1 := []string{beginWord} // 存储起点开始的待遍历节点
	queue2 := []string{endWord}   // 存储终点开始的待遍历节点
	level := 1                    // 存储当前节点所处的层数,即转换序列的长度
	for len(queue1) > 0 && len(queue2) > 0 {
		if len(queue1) > len(queue2) {
			queue1, queue2 = queue2, queue1 // 交换两个队列,保证 queue1 中的节点数目少于等于 queue2 中的节点数目
		}
		size := len(queue1)
		for i := 0; i < size; i++ {
			currWord := queue1[0]
			queue1 = queue1[1:]
			for _, nextWord := range getNextWords(currWord, wordSet) {
				if visited[nextWord] { // 如果从另一个方向已经访问过该节点,说明两个搜索相遇了,找到了最短路径
					return level + 1
				}
				if !visited[nextWord] {
					visited[nextWord] = true
					queue1 = append(queue1, nextWord)
				}
			}
		}
		level++ // 当前层的所有节点遍历完后,转换序列长度加 1
	}
	return 0 // 无法进行转换
}

// 获取与当前单词相差一个字母的单词列表
func getNextWords(word string, wordSet map[string]bool) []string {
	words := make([]string, 0)
	for i := 0; i < len(word); i++ {
		for j := 'a'; j <= 'z'; j++ {
			if byte(j) == word[i] {
				continue // 将当前字母跳过,避免重复
			}
			newWord := word[:i] + string(j) + word[i+1:]
			if wordSet[newWord] {
				words = append(words, newWord)
				delete(wordSet, newWord) // 将该单词从单词表中删除,避免重复遍历
			}
		}
	}
	return words
}

func main() {
	beginWord, endWord := "hit", "cog"
	wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
	wordList = []string{"hot", "dot", "dog", "lot", "log"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
}

输出:

5
0

代码3: 用126题的结果遍历出最大长度

package main

import (
	"fmt"
)

func ladderLength(beginWord string, endWord string, wordList []string) int {
	res := 0
	for _, arr := range findLadders(beginWord, endWord, wordList) {
		size := len(arr)
		if res < size {
			res = len(arr)
		}
	}
	return res
}

func findLadders(beginWord string, endWord string, wordList []string) [][]string {
	result, wordMap := make([][]string, 0), make(map[string]bool)
	for _, w := range wordList {
		wordMap[w] = true
	}
	if !wordMap[endWord] {
		return result
	}
	queue := make([][]string, 0)
	queue = append(queue, []string{beginWord})
	queueLen := 1
	levelMap := make(map[string]bool)
	for len(queue) > 0 {
		path := queue[0]
		queue = queue[1:]
		lastWord := path[len(path)-1]
		for i := 0; i < len(lastWord); i++ {
			for c := 'a'; c <= 'z'; c++ {
				nextWord := lastWord[:i] + string(c) + lastWord[i+1:]
				if nextWord == endWord {
					path = append(path, endWord)
					result = append(result, path)
					continue
				}
				if wordMap[nextWord] {
					levelMap[nextWord] = true
					newPath := make([]string, len(path))
					copy(newPath, path)
					newPath = append(newPath, nextWord)
					queue = append(queue, newPath)
				}
			}
		}
		queueLen--
		if queueLen == 0 {
			if len(result) > 0 {
				break
			}
			for k := range levelMap {
				delete(wordMap, k)
			}
			levelMap = make(map[string]bool)
			queueLen = len(queue)
		}
	}
	return result
}

func main() {
	beginWord, endWord := "hit", "cog"
	wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
	wordList = []string{"hot", "dot", "dog", "lot", "log"}
	fmt.Println(ladderLength(beginWord, endWord, wordList))
}

128. 最长连续序列 Longest Consecutive Sequence

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

代码1: 

package main

import (
	"fmt"
)

func longestConsecutive(nums []int) int {
	numSet := map[int]bool{}
	for _, num := range nums {
		numSet[num] = true
	}
	longestStreak := 0
	for num := range numSet {
		if !numSet[num-1] {
			currentNum := num
			currentStreak := 1
			for numSet[currentNum+1] {
				currentNum++
				currentStreak++
			}
			if currentStreak > longestStreak {
				longestStreak = currentStreak
			}
		}
	}
	return longestStreak
}

func main() {
	nums := []int{100, 4, 200, 1, 3, 2}
	fmt.Println(longestConsecutive(nums))
	nums = []int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}
	fmt.Println(longestConsecutive(nums))
}

输出:

4
9

代码2: 

package main

import (
	"fmt"
	"sort"
)

func longestConsecutive(nums []int) int {
	n := len(nums)
	if n == 0 {
		return 0
	}
	sort.Ints(nums)
	maxLength, currentLength := 1, 1
	for i := 1; i < n; i++ {
		if nums[i] != nums[i-1] {
			if nums[i] == nums[i-1]+1 {
				currentLength++
			} else {
				if maxLength < currentLength {
					maxLength = currentLength
				}
				currentLength = 1
			}
		}
	}
	if maxLength < currentLength {
		maxLength = currentLength
	}
	return maxLength
}

func main() {
	nums := []int{100, 4, 200, 1, 3, 2}
	fmt.Println(longestConsecutive(nums))
	nums = []int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}
	fmt.Println(longestConsecutive(nums))
}

129. 求根节点到叶节点数字之和 Sum Root-to-leaf Numbers

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2:

输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示:

  • 树中节点的数目在范围 [1, 1000] 内
  • 0 <= Node.val <= 9
  • 树的深度不超过 10

代码1: DFS

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func sumNumbers(root *TreeNode) int {
	if root == nil {
		return 0
	}
	stack := []*TreeNode{root}
	res := 0
	for len(stack) > 0 {
		node := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		if node.Left == nil && node.Right == nil {
			res += node.Val
			continue
		}
		if node.Right != nil {
			node.Right.Val += node.Val * 10
			stack = append(stack, node.Right)
		}
		if node.Left != nil {
			node.Left.Val += node.Val * 10
			stack = append(stack, node.Left)
		}
	}
	return res
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{1, 2, 3}
	root := buildTree(nums)
	fmt.Println(sumNumbers(root))
	nums = []int{4, 9, 0, 5, 1}
	root = buildTree(nums)
	fmt.Println(sumNumbers(root))
}

输出:

25
1026

代码2: 递归

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func sumNumbers(root *TreeNode) int {
	return dfs(root, 0)
}

func dfs(root *TreeNode, prevSum int) int {
	if root == nil {
		return 0
	}
	sum := prevSum*10 + root.Val
	if root.Left == nil && root.Right == nil {
		return sum
	}
	return dfs(root.Left, sum) + dfs(root.Right, sum)
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{1, 2, 3}
	root := buildTree(nums)
	fmt.Println(sumNumbers(root))
	nums = []int{4, 9, 0, 5, 1}
	root = buildTree(nums)
	fmt.Println(sumNumbers(root))
}

代码3: binaryTreePaths()结果求和,相关题目:

112. 路径总和 Path Sum  🌟

113. 路径总和 II Path Sum II  🌟🌟

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func sumNumbers(root *TreeNode) int {
	toNum := func(arr []int) int {
		num, base := 0, 1
		for i := len(arr) - 1; i >= 0; i-- {
			num += arr[i] * base
			base *= 10
		}
		return num
	}
	res := 0
	for _, path := range binaryTreePaths(root) {
		res += toNum(path)
	}
	return res
}

func binaryTreePaths(root *TreeNode) [][]int {
	res := [][]int{}
	if root == nil {
		return res
	}
	if root.Left == nil && root.Right == nil {
		return [][]int{{root.Val}}
	}
	leftPaths := binaryTreePaths(root.Left)
	rightPaths := binaryTreePaths(root.Right)

	paths := make([][]int, 0)
	for _, path := range leftPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	for _, path := range rightPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	return paths
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{1, 2, 3}
	root := buildTree(nums)
	fmt.Println(sumNumbers(root))
	nums = []int{4, 9, 0, 5, 1}
	root = buildTree(nums)
	fmt.Println(sumNumbers(root))
}

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML控件和对话框之ApplicationWindows

ApplicationWindows ApplicationWindows应用程序窗口Action菜单类控件3.StatusBar4.工具栏控件类 ApplicationWindows应用程序窗口 Application Window在 Qt Quick Controls中类似于QMain Window 在 Qt/C中的角色&#xff0c;ApplicationWindow可以充当应用程序顶层窗口&#…

气传导耳机是什么原理?气传导蓝牙耳机优缺点分析

气传导耳机&#xff0c;简而言之&#xff0c;就是一种通过空气振动进行声音传播的耳机&#xff0c;采用波束成形技术进行定向传音&#xff0c;开放双耳设计模式&#xff0c;将音频传送到耳朵。 其发声途径&#xff0c;和我们双耳聆听到环境音以及人声的途径都是一样的&#xf…

UART协议——异步全双工串行通信方式

文章目录 前言一、简介1、优点2、缺点 二、数据格式三、波特率1、定义2、波特率和采样频率 四、常见接口电平1、TTL电平2、RS232&#xff08;负逻辑&#xff09;3、RS485 前言 2023.4.22 世界地球日 一、简介 UART&#xff1a;Universal Asynchronous Receiver/Transmitter&a…

数据驱动+AI引擎,为MarTech打开全新的想象空间

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近年来&#xff0c;随着全球数字化、信息化进程不断提速&#xff0c;企业营销的战场也逐渐转移至线上。一方面&#xff0c;消费者行为的数字化使得企业营销活动更加依赖于线上数字营销&#xff1b;另一方面&#xff0c;包括…

Python3 字符串

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 Hello World! var2 "Runoob" Python 访问字符串中的值 Python 不支持单字符…

MySQL-CENTOS7下MySQL单实例安装

MySQL单实例安装 1 版本下载2 MySQL安装2.1 创建目录并解压2.2 安装数据库2.3 安装RPM包2.4 启动服务2.5 连接MYSQL 3 MYSQL卸载卸载4 FAQ 1 版本下载 mysql下载 选择对应的版本。我选择的是的8.0.31的版本。 2 MySQL安装 2.1 创建目录并解压 mkdir /mysql mkdir /mysql/s…

chatgpt智能提效职场办公-ppt怎么转pdf文件

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 要将PPT转为PDF文件&#xff0c;可以按照以下步骤操作&#xff1a; 1.打开PPT文件&#xff0c;点击“文件”菜单&#xff0c;选择“导出…

浅析商场智能导购系统功能与实施效益

商场智能导购系统是一种基于物联网技术和人工智能算法的解决方案&#xff0c;旨在提供商场内部的智能导购服务&#xff0c;为消费者提供个性化的购物导引和推荐&#xff0c;提升用户购物体验&#xff0c;增加商场的客流量和销售额。 商场智能导购系统的方案一般包括以下主要功能…

react中前端同学如何模拟使用后端接口操作数据?

为什么前端同学需要模拟后端数据 作为一个前端&#xff0c;在实现项目功能的时候&#xff0c;需要在前端写一个静态的json数据&#xff0c;进行测试。 项目中后端的接口往往是较晚才会出来&#xff0c;并且还要写接口文档&#xff0c;于是我们的前端的许多开发都要等到接口给…

pytest中的钩子函数:pytest_addoption(parser)

# python3 # Time : 2023/4/21 9:05 # Author : Jike_Ma # FileName: conftest.pyimport pytesthosts {"dev": "http://dev.com.cn","prod": "http://prod.com.cn","test": "http://test.com.cn" }# 注册一个…

使用WSL在Windows上安装Ubuntu

1. 清理环境 查看当前的wsl 状态&#xff0c;wsl --list 可以列出当前系统中已安装的子系统。 选择需要清理的系统&#xff0c;然后用 wsl --unregister <DistributionName> 即可完成卸载。 将 wsl 默认版本设置为 2&#xff1a; wsl --set-default-version 2 可以通…

taobao.item.carturl.get( 加购URL获取 )

&#xffe5;开放平台免费API可选用户授权 获取加购URL&#xff0c;支持添加商品到购物车 公共参数 请求地址: 公共请求参数: 公共响应参数: 点击获取key和secret 请求参数 请求示例 响应示例 异常示例

matlab笔记总结(4)

https://www.bilibili.com/video/BV1MA4y1d7so/?spm_id_from333.788&vd_source3ef6540f8473c7367625a53b7b77fd66 司守奎老师在B站的讲解视频 https://matlabacademy.mathworks.com/cn/details/matlab-onramp/gettingstarted MATLAB官方的入门之旅&#xff08;英文&…

ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战

文章目录 前言一、未来发展趋势1. ChatGPT重塑数据分析之道2. ChatGPT颠覆企业运用人工智能和机器学习的途径3. ChatGPT颠覆自动化商业流程4. ChatGPT引领企业决策迈向新纪元 二、ChatGPT掀开未来充满机遇和挑战的新篇章总结 前言 ChatGPT发展到目前&#xff0c;其实网上已经有…

如何用Python搭建HTTP服务器,并实现远程访问和下载?

Python是编程语言中的热门语言&#xff0c;具有语法简单、语句清晰的特点。如果你不擅长编程&#xff0c;学习Python是一个不错的选择&#xff0c;初学者在学习阶段可以较为轻松地理解编程对象和思维方法。对于小白用户来说,它具有强大且丰富的库,封装后可以轻松调用,因此也更受…

数学建模第一天:数学建模工具课之MATLAB的入门

目录 一、MATLAB的简介 二、Matlab基础知识 1. 变量 ①命名规则 ②特殊变量名 2、数学符号与函数调用 ①符号 ②数学函数 ③自定义函数 三、数组与矩阵 1、数组 ①创建数组 ②访问数组元素 ③数组运算 2、矩阵 ①定义 ②特殊矩阵 ③矩阵运算 四、控制流 …

pyecharts从入门到精通-地图专题GEO-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-Geo完成Geo地理坐标系实现。案例演示拓展-pyecharts中GEO源码 参考 官方文档:https://pyecharts.org/#/zh-cn/quickstart Python使用Pyecharts画Geo地图&#xff0c;如何显示具体地点名称 pyecharts世界地图用&#xff1a;国家中英文…

即使运行高优先级线程,低优先线程也能运行

仅仅因为一个线程具有较高的优先级&#xff0c;并不意味着其他低优先级的线程就不会得到机会运行。 这怎么理解&#xff1f; 有时候&#xff0c;我看到人们编写多线程代码&#xff0c;将一个线程的优先级置于另一个线程之上&#xff0c;他们认为这将防止优先级较低的线程干扰…

Qt编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)

一、前言说明 将从网络摄像头拉流过来的视频流重新推流出去&#xff0c;是目前一个很常规的做法&#xff0c;尤其是推流到流媒体服务中心&#xff0c;这样流媒体服务中心就把散落在各个区域的监控摄像头集中起来统一管理&#xff0c;同时提供对外一致的访问接口。很多时候不仅…

微信小程序开发的基础学习

回顾上篇内容 1、小程序核心理念&#xff1a; 在小程序里面&#xff0c;会把每一个标签看作一个矩阵&#xff0c;该矩阵的宽高会平行x轴、y轴 那么我们只需要知道该矩阵一个左上角的坐标&#xff0c;即可确定该矩阵的位置 2、题外话&#x1f9d0; &#xff08;1&#xff09…