力扣 回文链表-234
回文链表-234
const int N = 1e5+5;
int a[N];//定义一个整形的全局数组作为辅助数组存储链表反转前的值
class Solution {
/*本题的解题思路是先将链表中每个值存储到辅助数组a中,然后反转链表,
最后,反转后链表的值和没反转之前的值(存在辅助数组中的值)一一作比较,
如果每个值都相同则为回文链表返回true,否则返回false*/
public:
int i = 0;//i作为循环中数组的下标bool isPalindrome(ListNode* head) {//先将头节点head的位置存储起来,因为循环存储链表反转前的值时,head的位置会发生变化,就无法进行后续反转链表操作了ListNode* originalHead = head;//将链表中的每个节点的值存储到数组a中while(head!=NULL){a[i] = head->val;head = head->next;++i;}//以下是反转链表操作ListNode* cur = NULL;//定义一个ListNode类型的指针指向头节点的左一个位置,作为反转后链表的结尾ListNode* pre = originalHead;//定义一个ListNode类型的指针指向头节点位置//while循环当pre指向最后一个节点的右一个节点(NULL)时,全部反转完成,cur正好指向最后一个节点作为反转后的头节点while(pre!=NULL){//定义一个ListNode类型的指针t用来存储指针pre指向的下一个位置以便在修改当前节点的指针后能够继续遍历链表ListNode* t = pre->next;//进行局部反转,将pre的下一个节点改为指向上一个节点(cur)pre->next = cur;//局部反转过后进行右移,下一次循环之后继续pre,cur两个指针进行局部反转cur = pre;//局部反转后pre也进行右移,始终保持cur在左pre在右pre = t;//注意:如果不将pre的下一个节点存储在t中,那么在经过pre->next = cur后就无法再访问到原来的下一个节点了。}/*最后反转前的链表每个节点的值(存放在数组a中)与反转后链表每个节点的值作比较,只要遇到不同的就直接返回false,如果一直到循环结束都没遇到不同的值,则返回true*/for(int j = 0;j < i;j++){if(cur->val!=a[j])return false;cur = cur->next;}return true;}
};
每日问题
C C++ 中有哪些类型转换方式? 分别有什么区别?
1.隐式类型转换(自动类型转换)
定义:这是编译器自动进行的类型转换,不需要程序员显示地操作。它主要遵循一定的规则,在不丢失数据精度(或者在合理范围内丢失精度)的情况下,将一种数据类型转换为另一种数据类型。
转换规则示例:
算数运算中的转换:在进行算数运算时,如果操作数类型不同,编译器会自动进行转换。例如,在int + double的运算中,int类型的值会自动转换为double类型,然后进行加法运算。像3+3.5,编译器会将3转换为double类型的3.0,再和3.5相加,结果为6.5.
赋值运算中的转换:当把一个值赋给一个变量时,如果值的类型和变量类型不一致,也可能发生隐式转换。例如,将一个int值赋给一个double变量,int值会自动转换为double类型。如double d = 5;,这里5会自动转换为5.0后赋给d。但是,将一个较大范围类型的值赋给一个较小范围类型的变量时,可能会丢失数据精度,如int i = 3.9;,此时3.9会被截断为3赋给i。
特点:
便利性:隐式转换使得代码编写更加方便,程序员不需要手动处理很多常见的类型转换情况,编译器会自动按照规则进行处理。
潜在风险:可能会导致数据精度丢失或不符合预期的结果。特别是在涉及不同的混合运算和赋值时,需要注意数据类型的范围和精度变化。
2.显示类型转换(强制类型转换)
定义:这是程序员通过特定的语法手动进行的类型转换,用于再需要明确改变数据类型的情况下使用。
C语言中的强制类型转换方式:
基本语法:使用(目标类型)表达式的形式,例如,(int)3.14会将3.14强制转换为int类型,结果为3。
指针类型转换示例:在C语言中,还可以进行指针类型的强制转换。例如,假设有一个void*类型的指针void* p;,如果想将它转换为int*类型,可以使用(int*)p。但这种转换需要谨慎,因为如果转换不当可能会导致程序出错,如访问非法内存等情况。
这是最通用的类型转换方式,适用于所有基本数据类型和指针类型。但它也是最不安全的,因为它会进行尽可能宽松的转换,不考虑类型之间的兼容性和潜在的数据丢失。
C++语言中的强制类型转换方式(更安全和明确的方式):
1.静态类型转换(Static Case):
语法:static_cast(expression)
静态类型转换用于在具有明确、安全的转换路径的类型之间进行转换。它同通常用于基本数据类型之间的转化、相关类之间的转换(如基类与派生类之间的转换,前提是转换时安全的),以及void* 与其他指针类型之间的转换。
double a = 100.5;
int b = static_cast<int>(a);//将double转换为int,可能丢失小数部分
2.动态类型转换(Dynamic Cast)
语法:dynamic_cast(expression)
动态类型转换用于在运行时检查类对象的实际类型,并安全地向上或向下的类层次结构转换。它主要用于多态类型(即包含虚函数的类)。如果转换失败,dynamic_cast会返回nullptr(对于指针)或抛出std::bad_cast异常(对于引用)。
class Base{ virtual void func(){}};
class Derived : public Base{};Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);//将Base*转换为Derived*
3.常量类型转换(Const Cast)
语法:const_cast(expression)
常量类型转换用于去除或添加常量性(const 或 volatile)。它主要用于将 const 指针转换为非 const 指针(或反之),以便能够修改原本不可修改的数据。
const int* constPtr = &someValue;
int* nonConstPtr = const_cast<int*>(constPtr);//去除 const 属性
4.重解释类型转换(Reinterpret Cast)
语法:reinterpret_cast(expression)
重解释类型转换用于进行最低级别的转换,它基本上只是重新解释位模式。这种转换通常是不安全的,因为它几乎不进行任何检查,只是简单地告诉编译器将一种类型视为另一种类型。它主要用于底层编程(如与硬件接口)和与C代码的互操作。
最低级别的转换:
reinterpret_cast提供了C++中最低级别的类型转换能力。它几乎不进行任何类型检查,只是简单地告诉编译器:“我知道我在做什么,请把这个指针或引用当作另一种类型来处理。”
重新解释位模式:
当使用reinterpret_cast进行转换时,原始数据的位模式保持不变。这意味着,如果原始数据是以一种类型存储的,而转换后的类型以不同的方式解释这些位,那么得到的结果可能是完全不可预测的。
位模式:位模式,又称位流或位序列,是计算机内部数据的一种表示方式。它由一系列的二进制位(bit)组成,每个位只能是0或1。这些二进制位按照特定的顺序排列,形成了可以表示各种数据类型的位模式。
位模式数据表示:不同的位模式可以表示不同的数据类型,如整数、实数、字符等。通过特定的编码方式,位模式还可以表示更复杂的数据结构,如结构体、联合体等。
位模式应用:数据类型转换:在编程中,有时需要将一种数据类型的变量转换为另一种数据类型。这时,可以通过重新解释位模式的方式来实现类型转换。但需要注意的是,这种转换可能会导致数据丢失或精度下降,因此在使用时需要谨慎。
int a = 100;
void* ptr = &a;
int* intPtr = reinterpret_cast<int*>(ptr);//将 void* 转换为 int*
区别总结:
C风格的强制类型转换:通用但不安全,会进行尽可能宽松的转换。
静态类型转换:在编译时进行,用于明确且安全的类型转换。
动态类型转换:在运行时进行,用于多态类型的向上或向下转换,提供安全类型检查。
常量类型转换:用于添加或去除常量性(const 或 volatile)。
重解释类型转换:最低级别的转换,只是重新解释位模式,通常不安全。
选择哪种类型转换方式取决于具体的场景和安全性要求。在可能的情况下,应优先使用更安全的类型转换方式(如 static_cast 和 dynamic_cast),并尽量避免使用 C 风格的强制类型转换和 reinterpret_cast。
类型转换可能会带来哪些问题?
一、数据丢失
原因:一种数据类型的范围可能比另一种数据类型小。在将一个范围较大的数据类型转换为一个范围较小的数据类型时,超出目标类型表示范围的数据将被截断或丢弃。
示例:将一个浮点数转换为整数时,小数部分将被截断。将一个长字符串转换为一个短的VARCHAR类型时,超出长度的部分将被丢弃。
二、精度问题
原因:在进行数值类型的转换时,特别是从高精度类型向低精度类型转换时,精度可能会受到影响。
示例:将一个DECIMAL类型转换为FLOAT类型时,由于浮点数的二进制表示法无法准确地表示某些十进制小数,可能会导致精度丢失。
三、内存溢出
原因:在进行强制类型转换时,如果目标类型的内存表示比源类型大,而分配的内存不足以容纳转换后的数据,可能会导致内存溢出。
示例:在某些情况下,将一个较小的数据类型转换为较大的数据类型时,如果内存管理不当,可能会引发内存溢出错误。
四、运行时错误
原因:强制类型转换可能会引发运行时错误,特别是在类型之间存在不兼容的情况下。
示例:试图将一个类型转换为与其不兼容的类型时,将会引发异常或错误,并导致程序中断。例如,将一个字符串强制转换为整数时,如果字符串中包含非数字字符,转换将失败并抛出异常。
五、逻辑错误
原因:在进行类型转换时,如果开发者没有正确理解数据类型之间的关系或转换规则,可能会导致逻辑错误。
示例:错误地假设类型转换后的数据具有与原始数据相同的含义或行为,从而在程序中引入逻辑错误。
六、代码可读性降低
原因:过多地使用强制类型转换可能会降低代码的可读性,使代码变得难以理解和维护。
示例:当代码中存在大量的强制类型转换时,读者可能难以理解其含义和目的,从而增加程序的调试难度和维护成本。
七、安全性问题
SQL注入:在数据库操作中,从用户输入或其他不可信的来源获取数据时,不安全的类型转换可能导致SQL注入攻击。
代码注入:在动态生成代码时,不安全的类型转换可能导致代码注入攻击。
相关文章:
力扣 回文链表-234
回文链表-234 const int N 1e55; int a[N];//定义一个整形的全局数组作为辅助数组存储链表反转前的值 class Solution { /*本题的解题思路是先将链表中每个值存储到辅助数组a中,然后反转链表, 最后,反转后链表的值和没反转之前的值…...
采样率22050,那么CHUNK_SIZE 一次传输的音频数据大小设置多少合适?unity接收后出现卡顿的问题的思路
在采样率为22050的情况下,选择合适的 CHUNK_SIZE 主要取决于 Unity 接收和处理音频数据的效率。以下是设置 CHUNK_SIZE 的一些建议: 计算 CHUNK_SIZE:音频的传输数据量可以通过公式 CHUNK_SIZE 采样率 * 传输间隔秒数 * 每样本字节数 * 声道…...

网络初识--Java
一、网络通信基础 1.IP地址 IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主 机的⽹络地址。 就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。…...

K8S单节点部署及集群部署
1.Minikube搭建单节点K8S 前置条件:安装docker,注意版本兼容问题 # 配置docker源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 安装docker环境依赖 yum install -y yum-utils device-m…...

GPIO相关的寄存器(重要)
目录 一、GPIO相关寄存器概述 二、整体介绍 三、详细介绍 1、端口配置低寄存器(GPIOx_CRL)(xA...E) 2、端口配置高寄存器(GPIOx_CRH)(xA...E) 3、端口输入数据寄存器ÿ…...
OpenCV基础
1. 基础入门:OpenCV概念与安装 a. OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于图像和视频处理、计算机视觉、机器学习等领域。 b. 安装OpenCV Python安装: pip in…...

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤
深度学习环境的配置过于繁琐,所以我制作了两个基础的镜像,希望可以帮助大家节省时间,你可以选择其中一种进行安装,版本说明: base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel,默认 python 版本…...

Redis做分布式锁
(一)为什么要有分布式锁以及本质 在一个分布式的系统中,会涉及到多个客户端访问同一个公共资源的问题,这时候我们就需要通过锁来做互斥控制,来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…...
lambdaQueryWrapper详细解释
LambdaQueryWrapper 是 MyBatis Plus 提供的一个强大的查询条件构建工具,它允许你使用 Lambda 表达式来构建查询条件,从而使代码更加简洁和易读。下面详细介绍 LambdaQueryWrapper 的使用方法及其底层原理。 什么是 LambdaQueryWrapper? La…...

【工控】线扫相机小结 第三篇
海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe ,最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题: 需要注意的是,我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …...

golang中的init函数
程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包,那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到 fmt 包,但 它只会被导入一次&#x…...

理解和选择Vue的组件风格:组合式API与选项式API详解
目录 前言1. Vue 的两种组件风格概述1.1 选项式 API:直观且分块清晰1.2 组合式 API:灵活且逻辑集中 2. 深入理解组合式 API 的特点2.1 响应式变量与函数式编程2.2 逻辑组织更清晰2.3 更好的代码复用 3. 应用场景分析:如何选择 API 风格3.1 适…...

Java基础——高级技术
1. 单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1. Junit单元测试框架 可以用来对方法进行测试,他是第三方公司开源出来的(很多开发工具都已经集成了Junit框架,如IDEA&a…...
什么是SSL VPN?其中的协议结构是怎样的?
定义:SSL VPN是以SSL协议为安全基础的VPN远程接入技术,移动办公人员使用SSL VPN可以安全、方便的接入企业内网,访问企业内网资源,提高工作效率。 SSL(Security Socket Layer)是一个安全协议,为…...
程序员高频率面试题-整理篇
Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。 限流:一般是通过 Redis Lua 脚本的方式来实现限流。 消息队列&#x…...
第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字
文章目录 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字TCP设备的OPEN和USE命令关键字TCP设备的OPEN和USE命令关键字 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字 TCP设备的OPEN和USE命令关键字 可以使用位置参数(如上所述)或关键…...

CSS 语法规范
基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…...
Linux开发常用命令
文章目录 开发常用命令包管理 网络操作用户和权限系统监控nohup和screen的区别 开发常用命令 Linux开发中常用的命令非常多,以下是一些基本且重要的命令,这些命令对于日常的开发工作流程至关重要: 文件和目录操作 ls:列出目录内…...

Linux第92步_如何编写“设备树”下的platform设备驱动
Linux字符设备驱动,新字符设备驱动和设备树下的GPIO驱动,都是配置IO引脚所使用的GPIO寄存器,驱动开发方式和裸机没啥区别。Limux内核提供了pinctrl和gpio子系统用于GPIO驱动,借助它可简化GPIO驱动开发。 对GPIO进行读写操作&#…...
从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改
在 sophpi 中,默认网卡 eth0 的 MAC 地址未配置,是随机生成的。这样就会导致每次重启之后,MAC 地址会改变,从而导致通过 DHCP 获取 IP 地址每次也都在变化。 查看 MAC 地址 前文提到 eth0 自动使能并通过 DHCP 获取 IP 地址&…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...