力扣 二叉树的锯齿形层序遍历-103
二叉树的锯齿形层序遍历-103
此题就是再二叉树层序遍历的基础上,加了反转当前层数组元素的函数reverse(),也可以不反转,直接在遍历当前层的所有节点的for循环里直接进行if判断,根据遍历方向,决定如何插入元素。
class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {//二叉树的层序遍历vector<vector<int>> res;// 二维数组用来存储每层节点if(root == nullptr) return res;queue<TreeNode*> que;// 队列用来进行层序遍历que.push(root);// 将第一层的根节点加入队列中bool flag = true;//标记,用来标记每层的遍历方向while(!que.empty()){vector<int>vec;// 用于存储当前层的所有节点int n = que.size();// 当前层的节点个数for(int i=0;i<n;i++)//遍历当前层的所有节点{TreeNode* node = que.front();//将队列当前节点存下来que.pop();//将当前节点弹出队列//*************************************************************// 根据遍历方向,决定如何插入元素 // if (flag) {// vec.push_back(node->val); // 从左到右时,顺序插入// } else {// vec.insert(vec.begin(), node->val); // 从右到左时,将元素插入到开头// }//*************************************************************vec.push_back(node->val);//将存下来的当前节点if(node->left)que.push(node->left);//如果当前节点有左节点,加入队列if(node->right)que.push(node->right);//如果当前节点有右节点,加入队列}if(!flag)reverse(vec.begin(),vec.end());//翻转当前层数组中的元素res.push_back(vec);//将当前层的节点值加入结果flag = !flag;//反转遍历方向}return res;}
};
每日问题
什么是内存对齐?为什么需要内存对齐?
什么是内存对齐?
内存对齐(Memory Alignment) 是指计算机系统中数据存储的方式,要求数据按照特定的边界(通常是数据类型的大小)存储在内存中。也就是说,数据在内存中的地址应该是其大小的整数倍。
内存对齐的基本概念:
- 例如,32位的整数(int)通常需要存储在4字节边界上,也就是说,int 类型的变量地址应该是4的倍数。如果将一个32位整数存储在一个不是4的倍数的地址上,就会违反内存对齐规则。
- 相应地,64位的长整型(long long)通常需要存储在8字节边界上,因此它的地址应该是8的倍数。
内存对齐的规则通常依赖于机器架构和编译器。例如,在x86和ARM架构中,内存对齐是非常重要的,因为CPU对未对齐的访问可能会导致效率下降或者运行时错误。
为什么需要内存对齐?
内存对齐的主要原因有以下几点:
1.提高访问效率:
在现代CPU中,数据通常通过总线进行传输。如果数据在内存中不按照特定的边界对齐,CPU可能需要进行额外的操作来访问数据,导致访问速度变慢。例如,某些CPU只能在字边界上高效访问数据。如果数据没有按照字边界对齐,CPU就必须进行多次内存读取,增加了访问的时间。
2.硬件限制:
某些硬件平台(尤其是一些较旧的或嵌入式的处理器)要求内存对齐,否则会导致硬件错误。例如,一些处理器对于不对齐的访问会抛出异常或者产生未定义的行为。
3.内存访问的优化:
现代处理器通常有内存缓存(cache),并且内存访问往往是按块进行的。数据对齐可以确保处理器能够一次性加载一个内存块,这样可以减少内存访问次数,从而提高性能。
4.节省内存:
通过合理的内存对齐,编译器可以优化数据结构布局,尽量减少内存浪费。比如,在结构体(struct)中,编译器会通过插入填充字节(padding)来确保成员变量的对齐,从而使得每个变量能够尽可能高效地访问。
内存对齐的例子
假设我们有一个结构体 struct,包含多个不同大小的数据类型。我们来看一个简单的例子:
struct Example {char c; // 1字节int i; // 4字节
};
未对齐的布局:
在某些编译器中,char 类型的 c 会被存储在起始地址,紧接着 int 类型的 i 会被存储在接下来的内存位置,但由于 int 通常需要 4 字节对齐,编译器会插入一些填充字节(padding)来使 i 的地址是 4 的倍数。这种布局可能是这样的:
| char (1 byte) | padding (3 bytes) | int (4 bytes) |
总共需要 8 字节来存储这个结构体。
对齐后的布局:
为了确保内存对齐,int 类型的数据必须按照 4 字节边界存储。编译器会在 char 和 int 之间插入填充字节,使得 int 从 4 字节的地址开始:
| char (1 byte) | padding (3 bytes) | int (4 bytes) |
结果是,整个结构体占用 8 字节,其中 3 个字节是为了对齐 int 而插入的填充字节。
内存对齐的影响
1.性能:
对齐能够提高程序的内存访问效率,减少由于跨越多个内存区域(非对齐数据)导致的访问开销。
2.内存浪费:
为了保证内存对齐,结构体或数组中可能会插入一些填充字节。这些填充字节虽然没有被实际使用,但会导致内存浪费。例如,在一个包含多个不同类型字段的结构体中,可能会出现一些无用的内存占用。
内存对齐的处理
不同的编译器和平台可能对内存对齐的要求有所不同,但大多数现代编译器都会自动处理内存对齐问题。你也可以通过编译器提供的相关指令来控制内存对齐。例如,使用 #pragma pack 或 __attribute__((packed)) 等指令来改变结构体的对齐方式。
示例:在GCC中使用 __attribute__((packed))
struct __attribute__((packed)) Example {char c;int i;
};
使用 __attribute__((packed)) 可以告诉编译器不要插入填充字节,这样可以减少内存的占用,但会牺牲性能(因为这可能会导致不对齐的访问)。
总结
- 内存对齐是指将数据存储在内存中的地址遵循一定的对齐规则,使得数据存储在内存的边界上,这通常是数据类型大小的整数倍。
- 为什么需要内存对齐:内存对齐提高了数据访问的效率,避免了硬件故障,并确保数据访问的性能。
- 内存对齐的影响:虽然内存对齐可以提高性能,但有时可能会浪费内存,特别是在结构体中需要插入填充字节时。
通过合理利用内存对齐,可以有效提升程序的执行效率并减少内存访问的时间开销。
相关文章:
力扣 二叉树的锯齿形层序遍历-103
二叉树的锯齿形层序遍历-103 此题就是再二叉树层序遍历的基础上,加了反转当前层数组元素的函数reverse(),也可以不反转,直接在遍历当前层的所有节点的for循环里直接进行if判断,根据遍历方向,决定如何插入元素。 clas…...
PyCryptodome:Python中的密码学库
简介 PyCryptodome是一个功能强大的Python密码学库,提供了各种密码学算法的实现,包括对称加密、非对称加密、哈希函数、消息认证码等。它是对Python的Crypto库的一个现代化和增强版,提供了更好的性能和安全性。 Git地址 PyCryptodome的代码可…...
我眼中的“懂重构”(一)
初识重构 2017年的时候,领导让我看公司的一本书《重构——改善代码的既有设计》,这是一本JAVA版本的,前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂,然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入…...
Excel中日期格式“年月日 时间”修改为“年月日”
需求: 将Excel中“yyyy-mm-dd hh:mm:ss”格式的时间转换为“yyyy-mm-dd”格式的时间,选中转换后的时间时编辑栏中依然会显示“yyyy-mm-dd hh:mm:ss”格式。 方法一、在原数据列进行转换: 1、选中需要转换的数据列,右键--【设置…...
CSS底层基础:小白速来
1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观,包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素,并定义这些元素的具体样式属性。 基本结构示例: …...
【MySQL】库和表的基本操作
目录 库 库的增删查改 字符集与校验集 库的备份与恢复 表 表的创建和删除 用不同的存储引擎创建表的区别 查看表 修改表 添加删除属性 修改改变属性 上篇博客我们讲了数据库的基本理解,对数据库有了一个大致的概念,下面我们来介绍一下库和表的…...
5款AI智能办公工具丨提升办公效率‼️
办公效率低?工作压力大?别担心,这里有五款超实用的AI办公工具,帮你轻松搞定各种任务!🌟 简直不要太实用,快快收藏起来总有一天你会用得上~ 红薯通AI📝写作文案的好帮手,…...
华为HarmonyOS 让应用快速拥有账号能力 -- 3 获取用户手机号
场景介绍 当应用对获取的手机号时效性要求不高时,可使用Account Kit提供的手机号授权与快速验证能力,向用户发起手机号授权申请,经用户同意授权后,获取到手机号并为用户提供相应服务。以下只针对Account kit提供的手机号授权与快…...
lambda strem流表达式处理工具
一个通用的lambda stream流处理工具, 包含了工作中绝大部分场景常用的使用方式 import java.math.BigDecimal; import java.util.*; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.funct…...
Android 编译和使用libheif
项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接,需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题,多了一层路径&…...
新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲
(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架);…...
写NFC微信小程序跳转Uri标签
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8bEEGz&ftt&id615391857885 Dim dispstr As String Dim status As Byte Dim status1 As Byte Dim afi As Byte Dim myctrlword As Byte Dim mypiccserial(0 To 7) …...
Gradle vs. Maven: 到底哪个更适合java 项目?
ApiHug ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.https://apihug.com/ 首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版, 插件; 说到 Java 项目管理,有两个巨头脱颖而出&a…...
【赛博保安】安全日记之常用术语(一)
"企业的信息安全治理水平,直接取决于安全团队人员的技术专业度,而非运营经验值。所谓的技术,并非指渗透和挖洞的能力,而是指软件开发、IT 架构、网络拓扑相关的知识和经验。 站在乙方的角度来看,技术薄弱的安全人…...
设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...
008静态路由-特定主机路由
按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 …...
MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain
介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…...
VINS_MONO视觉导航算法【三】ROS基础知识介绍
文章目录 其他文章说明ROSlaunch文件基本概念定义用途 文件结构根标签常用标签\<node>\<param>\<rosparam>\<remap>\<include>\<arg>\<group> 示例基本示例嵌套示例 使用方法启动 *.launch 文件传递参数 总结 ROS topicTopic 的基本…...
Python 3 教程第13篇(集合)
Python3 集合 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集…...
cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection
原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection,构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…...
开发者如何使用GCC提升开发效率GUI操作
看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…...
什么是隐式类型转换?
隐式类型转换(Implicit Type Conversion)是指编译器在没有明确要求的情况下,自动地将一种类型的值转换为另一种类型。C 语言支持隐式类型转换,这通常发生在表达式运算或函数调用中,以确保操作数或参数的类型兼容性。 隐…...
爬虫专栏第三篇:Python 实战:运用 requests 突破京东商品评论获取难题(含 cookie 处理与编码设置技巧
简介:本文以京东商品评论为例,详细介绍了使用requests库获取网页数据的过程,包括从打开商品评价页面、抓包分析找到评论接口,到处理cookie参数、解决cookie字符串解析问题,以及设置正确的编码以成功获取评论数据&#…...
HCIE:详解OSPF,从基础到高级特性再到深入研究
目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接(Virtual-Link) OSPF的LSA和路由选择 OSPF…...
第六十六条:谨慎使用本地方法
其实在java中有很多都是采用C或C语言实现的比如native这种的本地方法,感兴趣的可以找源代码看看。 Java Native Interface (JNI) 允许Java应用程序可以调用本地方法(native method),所谓本地方法是指使用本地程序设计语言…...
neo4j如何存储关于liquidity structure的层次和关联结构
在 Neo4j 中存储关于流动性结构(liquidity structure)的层次和关联结构非常适合,因为 Neo4j 是一个基于图的数据库,能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…...
45 基于单片机的信号选择与温度变化
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲,通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…...
2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素
三要素之间关系: 有了虚拟场景Scene,相机录像Camera,在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene: 这个场景为三要素之一,一切需要展示的东西都需…...
Java基础面试题06:hashCode()和equals()方法的重要性体现在什么地方?
前言 Java中的hashCode()和equals()方法看似是干同一件事,但它们的使用场景和作用却大有不同。为了让程序更高效、更准确地运行,我们需要对这两者有深入的了解,并掌握它们的重写规则。 hashCode()和equals()的基础知识 什么是hashCode&…...
Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…...
C#基础之方法
文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...
Pytest框架学习19--参数化2
1、数据源是yaml 安装yaml,使用safe_load方法读取文件,解析出数据 pip install PyYAML # test_data.yaml test_case_1:a: 2b: 3expected_result: 5test_case_2:a: -1b: 10expected_result: 9test_case_3:a: 0b: 0expected_result: 0# test_code.pyimpor…...
VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法
问题描述 在VSCode中“Run Code”运行程序时,终端输出结果出现中文乱码现象: 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令: chcp输出结果是一段数字代码,如936,这说明当前的cmd编码方式…...
HarmonyOS 5.0应用开发——列表(List)
【高心星出品】 文章目录 列表(List)列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表(List) 列表介绍 列表作为一种容器,会自动按其滚动方向排列…...
C++设计模式外观模式(Facade)
什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心目的是解耦抽象部分和实现部分,让它们可以独立变化。在简单的描述中,桥接模式可以让你在不修改原有代码的情况下,分别…...
《Python基础》之Numpy库
目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 (1)、vstack() 纵向拼接 (2)、hs…...
Python异步编程与API调用:提高效率与性能的实践指南
引言 在当今的软件开发领域,异步编程已成为提高应用程序性能和响应能力的关键技术。特别是在处理I/O密集型任务,如API调用时,异步编程能够显著提升效率。本文将通过一个具体的示例——使用Python的asyncio和aiohttp库来异步调用APIÿ…...
Zookeeper3.4.14集群安装
Zookeeper3.4.14三节点集群安装 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群。(在一个节点模拟三节点,真实的三节点把ip替换一下即可,按照hadoop案件把网络打…...
电机驱动MCU介绍
电机驱动MCU是一种专为电机控制设计的微控制器单元,它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心,具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法,包括PID控制、FOC(Fi…...
Python 面向对象编程详解
Python 面向对象编程详解 面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。在 Python 中,面向对象编程非常强大,允许开发者通过类(class)和对象(object)来模…...
网络技术-不使用K8S情况下哪些方法可搭建服务链编排
在不使用Kubernetes(k8s)(或不使用Docker环境技术的)情况下,搭建服务链编排环境需要依赖其他服务编排和容器化技术,或者采用传统的虚拟机和服务管理方法。以下是一些可能的解决方案: 一、使用其…...
JVM_总结详解
1、CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内存模型:[什么是java内存模型?] 在计算机中,cpu和内存的交互最…...
go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源
go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…...
初级数据结构——邻接表
目录 前言一、定义与结构二、特点与性质三、构建方式四、操作与应用五、代码模版六、经典例题[1.——LCP 07. 传递信息](https://leetcode.cn/problems/chuan-di-xin-xi/description/)代码题解 [2.——547. 省份数量](https://leetcode.cn/problems/number-of-provinces/)代码题…...
思维导图+实现一个登录窗口界面
QQ2024122-205851 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QLabel, QVBoxLayout# 封装我的窗口类 class LoginWidget(QWidget):# 构造函数def __init__(self):# 初始化父类su…...
多级缓存设计实践
缓存是什么? 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质(如内存)中,减少对慢速存储设备(如硬盘或远程服务器)的访问次数,从而提升系统的响应速度和…...
ElasticSearch学习笔记一
目录 1.ElasticSearch-Head如何启动 2.ElasticSearch-Head创建索引 2.1创建索引时的“分片数”和“副本数”是什么意思? 类比 1:图书馆的书架与备份 类比 2:快递分拣中心与包裹副本 总结 编辑 2.2如何查看现有索引的分片数和备份数 …...
A058-基于Spring Boot的餐饮管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
代码设计:设计模式:应对变化
文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...