算法通过村第十二关-字符串|青铜笔记|隐形的王者

news2024/11/17 9:37:47

文章目录

  • 前言
  • 转换成小写字母
  • 字符串转换整数
  • 总结


前言


提示:为别人而活着,其实是最简单的一种活法。 --蔡崇达《命运》

字符串本身并不是一种数据结构,但是由于其本身的特殊性,额可以产生很多特殊的算法问题。另外,字符串在工程里也有非常广泛的应用。因此字符串在学习算法中是不可忽视的,属于是隐形的王者,一直以来也都是算法考察的重点问题之一,当然也是我们研究对象的重点。

字符串本身并不是一种数据结构,但是由于其本身的特殊性,可以产生一些特定的算法题目,而C、C++和Java等语言创建和管理字符串的方式也有差异,因此针对语言特征又会产生很多问题,这些问题也是算法中需要注意的,避坑。(这些也是常考的,技术面也长存在)在链表、数组等结构中,元素之间没有语义的关联的,但是字符串则不同,前后几个字母组合在一起就是一个单词,这个时候,我们就可以从一个单词,字母的角度等组合出很多花样,这也是为什么字符串问题之多的原因之一。

字符串里存放的可以是字母,也可以是数组,甚至是一些特殊符号,字母又可以分为大写和小写。这就会导致字符串的一类常见问题:转换问题。这些题目无非就是这几种类型之间相互转换。但是在转换的过程中需要处理几种特殊的情况:例如首先就是转之前判断当前元素能不能转。如果是字符串转数字,则要考虑当前元素是不是数字。转完之后会不会溢出等。问题本身并不复杂,但是需要考虑周全,如果考虑不周全的话,面试的时候的会被扣分。我们先看看下面的一些题目热手:

转换成小写字母

参考题目介绍:709. 转换成小写字母 - 力扣(LeetCode)
在这里插入图片描述
我们直到每个字母都是有确定的ASCII的,因此我们可以根据ASCII码表操作字符串即可:

找来了一张图片:ASCII码对应表,ASCII码值的大小顺序 (zhihu.com)

在这里插入图片描述
这里主要记住常用的字母和数字:

  • 0-9 48-57
  • A-Z 65-90
  • a-z 97-122

也就是常说的486597(597-486 = 111)

这个题目就是先遍历整个字符串,然后对每一位字符串作判断,如果str[i]在A-Z之间的后,则需要在原先的基础上ASCII加上32 即可转换成对应的小写啦:

	 /**
         * 大写字母转小写字母
         * @param s
         * @return
         */
    public static String toLowerCase(String s) {
        int n = s.length();
        // 获取chars数组操作
        char[] chars = s.toCharArray();
        for (int i = 0; i < n; i++) {
            if (chars[i] >= 65 && chars[i] <= 90) {
                chars[i] += 32;
            }
        }
        return new String(chars);
    }

字符串转换整数

这个题目主要考虑到转出数字的时候溢出的问题,我们会在后面继续讨论,先小试牛刀一下。

参考题目地址:8. 字符串转换整数 (atoi) - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
很多时候,需要考虑的是问题的分析能力。这道题目很长,给的实例也很多,当然这些要求也是我们必须要知道的。写代码的时候必须要考虑的。面试官也不会告诉你,如果你写代码不周,他可能提醒你,错不过三,不然后面你就废了。

题目最好需要用什么高级特性,就是最近本的写法。这里没有考察算法的知识,更多的是开发种对数据的处理问题(你要明确面试官在考察什么)【如参数校验等】。如果面试中遇到了,应该仔细阅读题目字说明,认真分析,可能存在的情况,有疑问即使和面试官确认,千万别阴沟翻船。

这里面我们罗列一些要点:

  • 需要去掉前导 空格;
  • 需要首先判断第一个字符是 + -的情况,因此需要设计一个变量sign,初始化的时候是1,如果遇到- ,将sign需要改为-1
  • 判断是否位数字,可以使用ASCII码值,进行比较,即 “0” <= c <= “9”,如果0在最前面,则应该去掉;
  • 如果第1个不是数字的字符时就停止,退出循环。
  • 如果转换以后数字超过int类型的范围,需要截取不能将res变量设置为long类型,注意:由于输入字符串转换以后可能超过long类型,因此需要在循环内部就判断时候越界如果越界就直接退出,这样也可以不必继续计算了。
  • 由于涉及下标的访问,因此全程需要考虑数组是否越界的情况。

特别注意:

  1. 由于题目中说【环境只能保存32位整数】,因此这里再每一轮循环之前需要先检查,具体看代码
  2. Java、Python和c++字符串的是设计都是不可边的,即使用trim()会产生新的变量,因此我们尽量不要使用库函数,使用一个变量index取遍历,这样遍历完成以后就可以转换以后的数值。
   /**
         * 字符串转整数 
         * @param str
         * @return
         */
    public static int myAtoi(String str) {
        int n = str.length();
        char[] chars = str.toCharArray();
        // 1.取出前导“ ”
        int index = 0;
        while(index < n && chars[index] == ' '){
            index++;
        }
        // 2.当然需要排除极端情况(全空)
        if (index == n){
            return 0;
        }
        // 3.如果出现符号字符,仅第1个有效,并记录正负值
        int sign = 1;
        char firstChar = chars[index];
        if (firstChar == '+'){
            index++;
        }else if(firstChar == '-'){
            index ++;
            sign = -1;
        }
        // 4.将后续出现的数字字符进行转换
        // 当然使用long是不行的,这丫是题目说的
        int res = 0;
        while(index < n){
            char currentChar = chars[index];
            // 4.1 先判断是否合法
            if (currentChar < '0' || currentChar > '9'){
                break;
            }
            // 题目中说只能存储32位大小的有符号整数 下面的两个if需要分别处理整数和负数情况
            // 前提是乘以10以后是否越界,但是res*10可能会越界,所以这里需要特殊处理,使用Integer.MAX_VALUE / 10,这样才不会越界。
            // 这里有经典处理溢出的问题
            if (res > Integer.MAX_VALUE /10 || (res == Integer.MAX_VALUE / 10 && (currentChar - '0') >Integer.MAX_VALUE % 10)){
                return Integer.MAX_VALUE;
            }
            if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currentChar - '0') > -(Integer.MIN_VALUE % 10))){
                return Integer.MIN_VALUE;
            }
            // 合法的情况下,才考虑率转换,每一步都把符号位乘进入
            // 想想这里为什么要带sign作乘法呢
            res = res * 10 + sign * (currentChar - '0');
            index++;
        }
        return res;
    }

上面这个实现确实能解决问题,但是太长了,但是太长了,我们可以使用JDK自带的库函数来简化都分操作,例如这里去掉前导空格,我们就可以使用trim。


总结

提示:字符串问题;字符串转换;字符串转整数;字符串转整数溢出问题;字符串特殊值


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之并发工具类的详细解析

3. 并发工具类 3.1 并发工具类-Hashtable Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象&#xff0c;但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable&#xff0c;但是Hashtable的效率低下。 代码实现 …

数据源报表

1.新建报表 2.新建数据集 3.维护数据源 支持的数据库还是蛮多哈 4.选择数据源表 5.编写sql 编码&#xff1a;SQL数据集的标识 注&#xff1a;避免特殊字符和_名称&#xff1a;SQL数据集的名称是否集合&#xff1a;否为单数据&#xff1b;是为多数据列表&#xff0c;如果多条数据…

MapStruct初窥门径

一、介绍 MapStruct相比于BeanUtils性能更高&#xff0c;能够实现DO&#xff0c;DTO&#xff0c;VO之间的转换&#xff0c;达到解耦合的目的 二、使用前提 添加依赖 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifa…

第八章 Linux文件系统权限

目录 8.1 文件的一般权限 1.修改文件或目录的权限---chmod命令 2.对于文件和目录&#xff0c;r&#xff0c;w&#xff0c;x有不同的作用&#xff1a; 3.修改文件或目录的所属主和组---chown,chgrp 8.2 文件和目录的特殊权限 三种通过字符描述文件权限 8.3 ACL 权限 1.A…

基于Java的药店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

1500*A. Boredom(DP)

Problem - 455A - Codeforces Boredom - 洛谷 解析&#xff1a; 首先统计每个数的个数&#xff0c;并且统计出最大值mx。 问题转换为&#xff0c;从1-mx 中选择任意个数字&#xff0c;使其都不相邻&#xff0c;求最大的总和。 开始没有思路&#xff0c;以为直接选取偶数位和奇…

项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分

一、焊接芯片及其外围电路 总体焊接过程没有出现什么大问题&#xff0c;也算顺利&#xff0c;下一步主要是根据SPI来编写代码&#xff0c;配置该芯片。 焊接之后的PCB如下(手工焊接&#xff0c;比较丑陋&#xff0c;哈哈哈哈) 之后测试了4.096V参考电压和晶振输出&#xff0c…

CART算法解密:从原理到Python实现

目录 一、简介CART算法的背景例子&#xff1a;医疗诊断 应用场景例子&#xff1a;金融风控 定义与组成例子&#xff1a;电子邮件分类 二、决策树基础什么是决策树例子&#xff1a;天气预测 如何构建简单的决策树例子&#xff1a;动物分类 决策树算法的类型例子&#xff1a;垃圾…

长时序栅格数据缺失值插补

长时序栅格数据经常会出现一些缺失值&#xff0c;会对后续的分析造成很大的不便。这便需要利用一些插值算法对这些缺失数据进行填补&#xff0c;奇异谱分析&#xff08;SSA&#xff09;便是常用的一种插值方法。更多内容可见公众号GeodataAnalysis。 简介 在时间序列分析中&a…

处理机调度的概念,层次联系以及七状态模型

1.基本概念 当有一堆任务要处理&#xff0c;但由于资源有限&#xff0c;这些事情没法同时处理。 这就需要确定某种规则来决定处理这些任务的顺序&#xff0c;这就是“调度”研究的问题。 2. 三个层次 1.高级调度&#xff08;作业调度&#xff09; 高级调度&#xff08;作业…

websocket逆向【python实现websocket拦截】

python实现websocket拦截 前言一、拦截的优缺点优点:缺点:二、实现方法1.环境配置2.代码三、总结前言 开发者工具F12,筛选ws后,websocket的消息是这样显示的,如何获取这里面的消息呢? 以下是本篇文章正文内容 一、拦截的优缺点 主要讲解一下websocket拦截的实现,现在…

结构和基本尺寸

声明 本文是学习GB-T 586-2015 船用法兰铸钢止回阀. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了法兰连接尺寸和密封面按 CB/T 4196、GB/T 2501 的船用法兰铸钢止回阀(以下简 称止回阀)的分类和标记、要求、试验方法、检验规…

sheng的学习笔记-【中英】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第四周测验

课程1_第4周_测验题 目录&#xff1a;目录 第一题 1.在我们的前向传播和后向传播实现中使用的 “缓存” 是什么&#xff1f; A. 【  】它用于在训练期间缓存成本函数的中间值。 B. 【  】我们用它将在正向传播过程中计算的变量传递到相应的反向传播步骤。它包含了反向传…

Linux系统编程系列之条件变量

一、什么是条件变量 条件变量是一种同步互斥机制&#xff0c;通常与互斥锁一起使用以实现线程之间的通信和同步。 二、问题的引入 先来看一个例子:小楠是一名在校学生&#xff0c;每个月都会从父母那里得到一笔生活费。现在她的钱花光了&#xff0c;想要去取钱。但是很显然取钱…

Redis-缓存穿透,缓存击穿,缓存雪崩

缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩 缓存穿透处理方案解决方案1 缓存空数据解决方案2 布隆过滤器 缓存击穿处理方案解决方案 1 互斥锁解决方案2 逻辑过期 缓存雪崩处理方案解决方案 1 给不同的key的过期时间设置添加一个随机值&#xff0c;降低同一个时段大量ke…

柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?

第一印象非常重要。所以当你第一次见到某人时&#xff0c;留下一个好印象很重要&#xff0c;尤其是当你面对一个重要的工作或者面对某个对你来说可能非常特别的人时。 下面我列出了一些最常用的说“很高兴见到你”的表达方法&#xff0c;也包括对方的回答&#xff0c;除了nice …

活动报名与缴费小程序开发笔记一

项目背景 活动报名与缴费小程序的开发背景主要源于以下几个因素&#xff1a; 1.数字化时代的需求&#xff1a; 随着移动互联网和智能手机的普及&#xff0c;人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐&#xff0c;而数字化报名与缴费小程序…

2023年-华为机试题库B卷(Python)【满分】

华为机试题库B卷 已于5月10号 更新为2023 B卷 &#xff08;2023-10-04 更新本文&#xff09; 华为机试有三道题目&#xff0c;前两道属于简单或中等题&#xff0c;分值为100分&#xff0c;第三道为中等或困难题&#xff0c;分值为200分。总分为 400 分&#xff0c;150分钟考试…

GKR+Groth16:更快的MiMC证明

1. 引言 Consensys团队Alexandre Belling等人2022年论文 Recursion over Public-Coin Interactive Proof Systems; Faster Hash Verification 中&#xff0c;提出了&#xff1a; 用GKR来证明MiMC哈希计算的完整性将GKR verifier嵌入到SNARK&#xff08;Groth16&#xff09;电…

【开发篇】十四、SpringBoot整合Quartz实现定时任务

文章目录 1、关于定时任务2、Java原生实现3、相关名词4、SpringBoot整合Quartz5、Quartz的通用配置6、关于QuartzJobBean7、关于调度器Scheduler的绑定8、Quartz持久化 1、关于定时任务 定时任务在实际开发中使用场景很多&#xff0c;比如&#xff1a; 年度报告各种统计报告某…