算法通关村第十二关——不简单的字符串转换问题
前言
字符串是我们在日常开发中最常处理的数据,虽然它本身不是一种数据结构,但是由于其可以包含所有信息,所以通常作为数据的一种形式出现,由于不同语言创建和管理字符串的方式也各有差异,因此针对不同语言特征又产生了很多问题。
常见的字符串转换题目,也就是在大小写字母、数字、特殊字符这几种类型之间进行。但是在转换过程中需要处理几种特殊情况,比如当前元素能否进行转换,如果是字符串转换为数字还要考虑当前元素是不是数字,转换之后是否会溢出等。
1.转换成小写字母
力扣709题,给你一个字符串 s
,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
分析:在计算机中,每个字符都有相应的ASCII
码。我们可以根据码表操作字符串,常见的ASCII
码范围:
0-9 48-57
A-Z 65-90
a-z 97-122
遍历整个字符串,对每一位字符串加以判断,如果字符串的编码值在65-90之间,就需要在原来了的ASCII
值上利用按位或运算| 32
就可以转换为对应小写。
代码如下:
// 使用内置函数
function toLowerCase(s) {return s.toLowerCase();
}// 自行实现
let toLowerCase = function (s) {const res = [];for (let charOfWord of s) {if (charOfWord.charCodeAt() >= 65 && charOfWord.charCodeAt() <= 90) {// 使用按位或位运算表示加法charOfWord = String.fromCharCode(charOfWord.charCodeAt() | 32);}res.push(charOfWord);}return res.join("");
};
2.字符串转换为整数(atoi)
力扣8题,请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
函数 myAtoi(string s)
的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为
0
。必要时更改符号(从步骤 2 开始)。 - 如果整数数超过 32 位有符号整数范围
[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于−231
的整数应该被固定为−231
,大于231 − 1
的整数应该被固定为231 − 1
。 - 返回整数作为最终结果。
注意:
- 本题中的空白字符只包括空格字符
' '
。 - 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
分析:
参考:Gatsby/力扣官方
这里用到了自动机的解法,用图来表示:
用表格来表示:
’ '(空格) | +/- | Number | 其它 | |
---|---|---|---|---|
start | start | signed | in_number | end |
signed | end | end | in_number | end |
in_number | end | end | in_number | end |
end | end | end | end | end |
代码如下:
/*** @param {string} s* @return {number}*/
var myAtoi = function(s) {// 自动机类class Automaton {constructor() {// 执行阶段:默认是开始阶段this.state = 'start';// 正负符号:默认是正数this.sign = 1;// 数值,默认是0this.answer = 0;/*关键点:状态和执行的阶段的对应表含义:[执行阶段, [空格], [正负号], [数值], [其它]]*/this.map = new Map([['start',['start', 'signed', 'in_number', 'end']],['signed', ['end', 'end', 'in_number', 'end']],['in_number', ['end', 'end', 'in_number', 'end']],['end', ['end', 'end', 'end', 'end']],]);}// 获取状态的索引getIndex(char) {if (char === ' ') {return 0;} else if (char === '-' || char === '+') {return 1;} else if (isNumeric(char)) {return 2;} else {return 3;}}/*关键点:字符转换执行函数*/get(char) {const MIN_VALUE = -Math.pow(-2, 31);const MAX_VALUE = Math.pow(2, 31) - 1;/*易错点:每次传入字符,都要变更自动机的执行阶段*/this.state = this.map.get(this.state)[this.getIndex(char)];if (this.state === 'in_number') {/*小技巧:在JS中,对字符串类型做减法操作,可以得到一个数值型(Number)的值易错点:本处需要利用括号来提高四则运算的优先级*/this.answer = this.answer * 10 + (char - 0);// 易错点:在进行负数比较时,需要将INT_MIN变为正数this.answer = (this.sign === 1 ? Math.min(this.answer, MAX_VALUE) : Math.min(this.answer, MIN_VALUE));} else if (this.state === 'signed') {/*优化点:对于一个整数来说,非正即负,所以正负号的判断,只需要一次。所以可以降低其判断的优先级*/this.sign = (char === '+' ? 1 : -1);}}}// 判断传进来的字符串是不是数字function isNumeric(s) {return /^-?\d+(\.\d+)?$/.test(s);}// 生成自动机实例let automaton = new Automaton();// 遍历每个字符for (let char of s) {// 依次进行转换automaton.get(char);}// 返回值,整数 = 正负 * 数值return automaton.sign * automaton.answer;
};
在判断传入的字符是不是数字时,最好用正则表达式来判断,这样比较准确。
用typeof Number(char) === 'number'
和!isNaN(char)
都不太合理:
typeof Number(char) === 'number'
: 这部分判断使用了typeof
操作符,它会将Number(char)
的结果判定为'number'
。然而,Number(char)
在转换无法转换为有效数字的字符串时会返回NaN
,而typeof NaN
也是'number'
,因此这部分判断并不能准确地判断传入的字符串是否是一个有效的数字。!isNaN(char)
: 这部分判断使用了isNaN
函数,它用于检查一个值是否为NaN
。然而,isNaN
函数在判断非数字类型的值时也会返回false
,比如空字符串、布尔值、对象等。这也就意味着,如果传入的是非数字但却不是NaN
的值,这部分判断同样会得出错误的结论。
相关文章:

算法通关村第十二关——不简单的字符串转换问题
前言 字符串是我们在日常开发中最常处理的数据,虽然它本身不是一种数据结构,但是由于其可以包含所有信息,所以通常作为数据的一种形式出现,由于不同语言创建和管理字符串的方式也各有差异,因此针对不同语言特征又产生…...

PROSOFT PTQ-PDPMV1网络接口模块
通信接口:PROSOFT PTQ-PDPMV1 网络接口模块通常配备了多种通信接口,以便与不同类型的设备和网络进行通信。常见的接口包括以太网、串行端口(如RS-232和RS-485)、Profibus、DeviceNet 等。 协议支持:该模块通常支持多种…...

力扣(LeetCode)算法_C++——稀疏矩阵的乘法
给定两个 稀疏矩阵 :大小为 m x k 的稀疏矩阵 mat1 和大小为 k x n 的稀疏矩阵 mat2 ,返回 mat1 x mat2 的结果。你可以假设乘法总是可能的。 示例 1: 输入:mat1 [[1,0,0],[-1,0,3]], mat2 [[7,0,0],[0,0,0],[0,0,1]] 输出&am…...

华为云API人脸识别服务FRS的感知力—偷偷藏不住的你
云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:人工智能AI人脸的识别、检测、搜索、比对 1、IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE,…...
产品技术体系
产品,是一个企业或公司针对市场客户推出的一系列相关的功能或者服务,为对应的客户解决实际问题,进而产生对应的商业、社会价值。有了这些实际的价值,企业就会获得相应的利益或者利润回报。正常来讲,这应该是一个良性的…...

Docker从认识到实践再到底层原理(二-3)|LXC容器
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
[运维|docker] ubuntu镜像更新时报E: Problem executing scripts APT::Update::Post-Invoke错误
参考文献 docker-ce在ubuntu:22.04进行apt update时报错E: Problem executing scripts APT::Update::Post-Invoke 详细报错信息 E: Problem executing scripts APT::Update::Post-Invoke rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/c…...

计算机网络的故事——HTTP首部
HTTP首部 在HTTP协议通信交互中使用的首部字段。不限于RFC2616中定义的47种首部字段,还有Cookie、setCookie和Content-Disposition等 HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。端到端首部和逐跳首部...
js农历与阳历转换使用笔记
1、新建utils/dateChange.js /*** 1900-2100区间内的公历、农历互转* charset UTF-8* Author jiangjiazhi* 公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]* 农历转公历:calendar.lunar2solar(1987,09,10); //[…...

苹果与芯片巨头Arm达成20年新合作协议,将继续采用芯片技术
9月6日消息,据外媒报道,芯片设计巨头Arm宣布在当地时间周二提交给美国证券交易委员会(SEC)的最新IPO文件中,透露与苹果达成了一项长达20年的新合作协议,加深了双方之间的合作关系。 报道称,虽然…...

Linux下systemd深入指南:如何优化Java服务管理与开机自启配置
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

PMOS阵列(PMOS阵列代替)
pmos阵列没有找到,不过高压侧驱动芯片倒是可以使用VN340SP Datasheet - VN340SP-E & VN340SP-33-E - Quad high-side smart power solid-state relayhttps://www.st.com/resource/en/datasheet/vn340sp-33-e.pdf VN340SP-E - 四通道高侧智能功率固态继电器 - 意…...

Linux常见指令
1、ls指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项: -a 列出目录下的所有文件,包括以 . 开头的隐含文件-l 列出…...
让开发回归简单模式-组件封装
对于工作年限不长的程序员来说,知识储备是非常关键的。在开发中各种技术的应用已经非常普遍了,例如常见的各种ORM,各种中间件如Redis,MQ等等,又如WebApi路由配置等等,对于常常做开发的程序员来说,都是小事&…...

LED显示屏安全亮度参数设置方法和防护
随着LED显示屏应用领域越来越广,但其高亮度造成的光污染,常受到的人们的诟病。为了更好的避免光污染,我整理了一些关于LED显示安全亮度参数设置方法和安全防护措施。你知道LED广告牌是如何工作的吗? 设置LED显示屏的安全亮度参数和…...
数据库sql--关于计算方圆5公里点位编写
当我们计算两个地球上任意两点之间的距离时,可以使用Haversine公式。 下面是每个函数和数值的详细解释: RADIANS(target_latitude):将目标纬度值转换为弧度制。这是因为Haversine公式以弧度为单位计算角度。RADIANS(latitude):将…...

嵌入式基础知识-DMA
本篇来介绍DMA的一些基础知识。 1 DMA简介 DMA(Direct Memory Access),中文名为直接内存访问,它是一些计算机总线架构提供的功能,能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。对应嵌…...

STM32 软件IIC 控制OLED 显示屏
1. 硬件IIC 实在是太难用了,各种卡死,各种发不出来数据,没那么多时间折腾了,还是用软件IIC 先吧,初始化 void OLED_Software_IIC_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_AHBPeriphClockCmd(OLED_SOFTWARE…...

【系统设计系列】 DNS和CDN
系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…...

thinkphp中使用Elasticsearch 7.0进行多表的搜索
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、thinkphp中使用Elasticsearch 7.0进行多表的搜索二、使用步骤1.引入库2.读入数据 总结 前言 提示:thinkphp中使用Elasticsearch 7.0进行多表的…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...