力扣 回文链表-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 地址&…...

JMeter与大模型融合应用之JMeter日志分析服务化实战应用
JMeter与大模型融合应用之JMeter日志分析服务化 引言 在当今的互联网时代,网站和应用程序的性能直接影响到用户的体验和业务的成功。为了保证系统的稳定性和高效性,性能测试成为了软件开发过程中的一个重要环节。在这其中,Apache JMeter作为一款开源的性能测试工具,凭借其…...

AtCoder Beginner Contest 380(A-F)
比赛链接:AtCoder Beginner Contest 380(A-F) A - 123233 题意 给出一个数字 N N N,问这个数字中是否 1 1 1 恰好出现了 1 1 1 次, 2 2 2 恰好出现了 2 2 2 次, 3 3 3 恰好出现了 3 3 3 次。 数据范围 100000 ≤ N ≤ 99…...

多线程-阻塞队列
目录 阻塞队列 消息队列 阻塞队列用于生产者消费者模型 概念 实现原理 生产者消费者主要优势 缺陷 阻塞队列的实现 1.写一个普通队列 2.加上线程安全和阻塞等待 3.解决代码中的问题 阻塞队列 阻塞队列,是带有线程安全功能的队列,拥有队列先进…...

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现
el-table 中有现成的隔行换色功能,只要增加 stripe 属性即可。但是如果有单元格合并的话,这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并:基于表头中的某一列,具有相同值的个数相加进行合…...

java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
在这篇文章中,我们将学习如何使用Java编程语言模拟键盘输入,特别是模拟上下左右方向键的操作。这是一个很有趣的项目,尤其适合刚入行的开发者。我们将分步进行,接下来,我们会通过表格展示整个实现过程,然后…...

SDF,一个从1978年运行至今的公共Unix Shell
关于SDF 最近发现了一个很古老的公共Unix Shell服务器,这个项目从1978年运行至今,如果对操作系统,对Unix感兴趣,可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…...

前馈神经网络 (Feedforward Neural Network, FNN)
代码功能 网络定义: 使用 torch.nn 构建了一个简单的前馈神经网络。 隐藏层使用 ReLU 激活函数,输出层使用 Sigmoid 函数(适用于二分类问题)。 数据生成: 使用经典的 XOR 问题作为数据集。 数据点为二维输入ÿ…...

【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
1、数据持久化与访问效率 数据持久化是指程序运行过程中产生的数据能够长期保存,即使程序关闭或系统重启后仍可读取和修改。通过数据库,我们可以确保数据持久化的同时,实现数据的快速访问。例如,银行系统需要实时更新账户余额&am…...

ZooKeeper单机、集群模式搭建教程
单点配置 ZooKeeper在启动的时候,默认会读取/conf/zoo.cfg配置文件,该文件缺失会报错。因此,我们需要在将容器/conf/挂载出来,在制定的目录下,添加zoo.cfg文件。 zoo.cfg logback.xml 配置文件的信息可以从二进制包…...

函数指针示例
目录: 代码: main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…...