当前位置: 首页 > news >正文

力扣 回文链表-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中&#xff0c;然后反转链表&#xff0c; 最后&#xff0c;反转后链表的值和没反转之前的值&#xf…...

采样率22050,那么CHUNK_SIZE 一次传输的音频数据大小设置多少合适?unity接收后出现卡顿的问题的思路

在采样率为22050的情况下&#xff0c;选择合适的 CHUNK_SIZE 主要取决于 Unity 接收和处理音频数据的效率。以下是设置 CHUNK_SIZE 的一些建议&#xff1a; 计算 CHUNK_SIZE&#xff1a;音频的传输数据量可以通过公式 CHUNK_SIZE 采样率 * 传输间隔秒数 * 每样本字节数 * 声道…...

网络初识--Java

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

K8S单节点部署及集群部署

1.Minikube搭建单节点K8S 前置条件&#xff1a;安装docker&#xff0c;注意版本兼容问题 # 配置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、端口配置低寄存器&#xff08;GPIOx_CRL&#xff09;&#xff08;xA...E&#xff09; 2、端口配置高寄存器&#xff08;GPIOx_CRH&#xff09;&#xff08;xA...E&#xff09; 3、端口输入数据寄存器&#xff…...

OpenCV基础

1. 基础入门&#xff1a;OpenCV概念与安装 a. OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像和视频处理、计算机视觉、机器学习等领域。 b. 安装OpenCV Python安装&#xff1a; pip in…...

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐&#xff0c;所以我制作了两个基础的镜像&#xff0c;希望可以帮助大家节省时间&#xff0c;你可以选择其中一种进行安装&#xff0c;版本说明&#xff1a; base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel&#xff0c;默认 python 版本…...

Redis做分布式锁

&#xff08;一&#xff09;为什么要有分布式锁以及本质 在一个分布式的系统中&#xff0c;会涉及到多个客户端访问同一个公共资源的问题&#xff0c;这时候我们就需要通过锁来做互斥控制&#xff0c;来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…...

lambdaQueryWrapper详细解释

LambdaQueryWrapper 是 MyBatis Plus 提供的一个强大的查询条件构建工具&#xff0c;它允许你使用 Lambda 表达式来构建查询条件&#xff0c;从而使代码更加简洁和易读。下面详细介绍 LambdaQueryWrapper 的使用方法及其底层原理。 什么是 LambdaQueryWrapper&#xff1f; La…...

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …...

golang中的init函数

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

理解和选择Vue的组件风格:组合式API与选项式API详解

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

Java基础——高级技术

1. 单元测试 就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试。 1.1. Junit单元测试框架 可以用来对方法进行测试&#xff0c;他是第三方公司开源出来的&#xff08;很多开发工具都已经集成了Junit框架&#xff0c;如IDEA&a…...

什么是SSL VPN?其中的协议结构是怎样的?

定义&#xff1a;SSL VPN是以SSL协议为安全基础的VPN远程接入技术&#xff0c;移动办公人员使用SSL VPN可以安全、方便的接入企业内网&#xff0c;访问企业内网资源&#xff0c;提高工作效率。 SSL&#xff08;Security Socket Layer&#xff09;是一个安全协议&#xff0c;为…...

程序员高频率面试题-整理篇

Redis 除了做缓存&#xff0c;还能做什么&#xff1f; 分布式锁&#xff1a;通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下&#xff0c;我们都是基于 Redisson 来实现分布式锁。 限流&#xff1a;一般是通过 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开发中常用的命令非常多&#xff0c;以下是一些基本且重要的命令&#xff0c;这些命令对于日常的开发工作流程至关重要&#xff1a; 文件和目录操作 ls&#xff1a;列出目录内…...

Linux第92步_如何编写“设备树”下的platform设备驱动

Linux字符设备驱动&#xff0c;新字符设备驱动和设备树下的GPIO驱动&#xff0c;都是配置IO引脚所使用的GPIO寄存器&#xff0c;驱动开发方式和裸机没啥区别。Limux内核提供了pinctrl和gpio子系统用于GPIO驱动&#xff0c;借助它可简化GPIO驱动开发。 对GPIO进行读写操作&#…...

从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改

在 sophpi 中&#xff0c;默认网卡 eth0 的 MAC 地址未配置&#xff0c;是随机生成的。这样就会导致每次重启之后&#xff0c;MAC 地址会改变&#xff0c;从而导致通过 DHCP 获取 IP 地址每次也都在变化。 查看 MAC 地址 前文提到 eth0 自动使能并通过 DHCP 获取 IP 地址&…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...