JAVA刷题之字符串的一些个人思路

感谢您的阅读!

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的刷题系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

一.把字符串转换成整数

1.首先我们看到这一题我们可以注意到字符串的数据范围为0<= n <=100 所以我们要先考虑好边界问题

 如果字符串为空,或者是字符串的长度为0 我们就return 0
if (str == null || str.length() == 0) {
            return 0;
        }

2.现在我们来到第二步,可以看出题目的意思为除了+ - 以外的符号时直接输出0,出现了判断的问题,所以我们要把字符串给转换成char 数组的形式这样子转换成数组的形式更好对字符串的元素进行操作

//使用库函数把字符串转换成数组的形式
char[] ch = str.toCharArray();

3.我们现在来到第三步可以看到题目的注意:字符串中可能出现 +/- 且仅可能出现在字符串首位

我们就可以先对字符串数组的第一个元素也就是char[0]判断一下是否为   -  

        int a = 1;//如果数组的第一个元素判断为符号 - 就赋值为 -1 
        int b = 0;//如果数组的第一个元素判断为符号 +/- 就加一 数组就从下标为1的时候开始判断
        if (ch[0] == '+') {
            b = 1;
        }else if (ch[0] == '-') {
            b = 1;
            a = -1;
        }

4.我们使用for循环来判断数组的元素是否为非数字

       int result = 0;
        for (int i = b; i < ch.length; i++) {
          // 判断当前字符是否为数字,如果不是,则返回0 
            if (!Character.isDigit(ch[i])) {
                return 0;
            }
            int digit = ch[i] - '0';// 通过将字符减去字符'0'得到对应的数字
            result =result*10 + digit;// 将当前数字添加到结果中,乘以10表示将当前数字放在个位上 
        }
        return a * result;
    }

总体的代码

import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        char[] ch = str.toCharArray();
        int a = 1;
        int b = 0;
        if (ch[0] == '+') {
            b = 1;
        }else if (ch[0] == '-') {
            b = 1;
            a = -1;
        }
        int result = 0;
        for (int i = b; i < ch.length; i++) {
            if (!Character.isDigit(ch[i])) {
                return 0;
            }
            int digit = ch[i] - '0';
            result =result*10 + digit;
        }
        return a * result;
    }
}

二..
字符串相加

首先我们可以从下图看到例如字符串“12345” 和“12”是如何相加的

我们可以看出两个字符串相加是从num1的最后一个元素和num2的最后一个元素开始相加的,那么我们就有这样一个思路,先把两个字符串转换成数组的形式,然后让它们的最后一个元素开始相加,在设一个参数carry,如果相加大于9,Carry就加一否则就为0,然后使StringBuilder.append(),把数组元素添加进行添加,需要注意的是因为是从尾部开始添加,所以我们还需要逆置,以上就这个题总体思路了现在我们进行分步讲解

1.根据上文已知的思路,我们要从尾部开始,那我们是不是需要获取到它们尾部的下标,以及我们还需要创建一个参数来表示两数相加后的进位carry 所以可以得出以下代码:

int i = num1.length()-1;
int j = num2.length()-1;
int carry = 0;//进位

2.因为需要用到 StringBuilder.append(),和 StringBuilder.reverse()方法所以我们需创建 StringBuilder对象

 StringBuilder s = new  StringBuilder();

3.因为需要转换成数组的形式所以有以下代码

char[] ch1 = num1.toCharArray();
char[] ch2 = num2.toCharArray();

 4.好前期的一些参数准备我们都设立好了,现在让我们开始解决本题的关键步骤,让两个数组的尾部元素相加,直到进位数为0,或者其中一位数组的元素加完了。结合上文思路可以得出以下代码,(如果看不懂这段代码博主建议自己画一下两数相加的图,然后结合博主的思路以及下文代码的注释,多看几遍,相信聪明的你肯定可以解决):

//这里加个carry != 0 的条件是为了确保两个数组的所有个数字的所有位都已经相加完毕,但如果还有进位的话,也要继续将进位加到结果中。

while(i >= 0 || j>= 0 || carry!= 0) {
int x = ch1[i] < 0 ? 0:ch1[i--]-'0';
//这里只有数组的长度不为0就获取到数组i下标的元素,为什么要减‘0’,因为字符数组的元素数字为ASC11值所以为了得到整数我们需要减去零的ASC11值就可以得到整数了,i--是因为只要数组的长度不为0就移到下一位

int y = ch2[j] < 0 ? 0:ch2[j--] - '0';
//同理

int sum = x+y+carry;
//求得两数相加的值

s.append(sum % 10)
//将 sum 的个位数加入到 StringBuilder s 的末尾。因为两个数相加后可能会产生进位,所以只将个位数加入到结果中,而十位数则要在下一次循环中加上。sum % 10 可以得到 sum 的个位数,比如 sum 为 15,则 sum % 10 的结果为 5。

carry = sum/10;
//得到两数相加后的进位
}

5.需要特别注意的一点是使用s.append()后是字符串是为逆置的,所以我们需要逆转字符串所以可以得到以下代码:

return s.reverse().toString//因为题目要求的是返回字符串所以我们需要使用s.toString

6.以下为完整代码

class Solution {
    public String addStrings(String num1, String num2) {
        int i = num1.length()-1;
        int j = num2.length()-1;
        int carry = 0;
        StringBuilder s = new StringBuilder();
        char[] ch1 = num1.toCharArray();
        char[] ch2 = num2.toCharArray();
        while(i >= 0 || j >= 0 || carry != 0) {
            int x = i < 0 ? 0 : ch1[i--] - '0';
            int y = j < 0 ? 0 : ch2[j--] - '0';
            int sum = x+y+carry;
            s.append(sum % 10);
            carry = sum / 10;
        }
        return s.reverse().toString();
    }
}

这个方法的执行用时,及内存分布 

二.1字符串相加扩展:

博主做完这道题,又自己给自己做了一个假设,如果两个数可以为负数该如何解呢

public class Solution {
    public String addStrings(String num1, String num2) {
        boolean isNegative1 = num1.charAt(0) == '-';
        boolean isNegative2 = num2.charAt(0) == '-';

        // 去掉负号
        num1 = isNegative1 ? num1.substring(1) : num1;
        num2 = isNegative2 ? num2.substring(1) : num2;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        StringBuilder result = new StringBuilder();
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int n1 = i >= 0 ? num1.charAt(i--) - '0' : 0;
            int n2 = j >= 0 ? num2.charAt(j--) - '0' : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            result.append(sum % 10);
        }

        if (carry > 0) {
            result.append(carry);
        }

        boolean isNegativeResult = false;
        if ((isNegative1 && !isNegative2) || (!isNegative1 && isNegative2)) {
            // 如果两个数的符号不同,则结果的符号与数值大的那个相同
            isNegativeResult = num1.length() < num2.length();
        } else if (isNegative1 && isNegative2) {
            // 如果两个数都是负数,则结果的符号与绝对值小的那个相同
            int absNum1 = Integer.parseInt(num1);
            int absNum2 = Integer.parseInt(num2);
            isNegativeResult = absNum1 > absNum2;
        }
        return isNegativeResult ? "-" + result.toString() : result.toString();
    }
}

如果你有更好的解法也可以私信博主哦,大家一起讨论 

三.验证回文串

还是和前面几题一样我们先确定自己的总体思路:首先比较字符串是否回文,我们了可以设定头部元素和尾部元素,进行动态移动然后比较是否相等,因为要忽视非字母数字字符,我们可以用到Character.isisLetterOrDigit 方法这样使用while循环直到头部指针等于尾部指针,就证明字符串回文了,以上就是本体的总体思路了,现在博主为大家分布讲解

1.根据上文已知的思路,我们需要取得头部部分和尾部部分

 int start = 0;
 int end = s.length()-1;

2.根据上文思路我们需要写一个while循环,动态移动头部和尾部

 while(start < end){
            char chS = s.charAt(start);
            char chE = s.charAt(end);
            //头部指针指向的元素不为字母或者是数字就往后移动
            if(!Character.isLetterOrDigit(chS)){
                start++;
            }
            //尾部指针指向的元素不为字母或者是数字就往前移动
            else if(!Character.isLetterOrDigit(chE)){
                end--;
            }
            //先把字母转换成小写后比较如果不相等就返回false
            else if(Character.toLowerCase(chS)!=Character.toLowerCase(chE)){
                return false;
            }
            //如果相等就动态移动
            else{
                start++;
                end--;
            }
   }
//如果头部指针等于尾部指针就说明这个字符串以及遍历完成了,形成回文 返回true
        return true;

3.总体代码

class Solution {
    public boolean isPalindrome(String s) {
        int start = 0;
        int end = s.length()-1;
        while(start < end){
            char chS = s.charAt(start);
            char chE = s.charAt(end);
            if(!Character.isLetterOrDigit(chS)){
                start++;
            }
            else if(!Character.isLetterOrDigit(chE)){
                end--;
            }
            else if(Character.toLowerCase(chS)!=Character.toLowerCase(chE)){
                return false;
            }
            else{
                start++;
                end--;
            }
        }
        return true;
    }
}

这个方法的执行用时,及内存分布

四.说明

以上就是博主关于String 的刷题了,用于博主也才刚开始学习Java,所以可能有些地方的解法不是最优解,还有很大的进步空间,希望看完之后可以对你可以有一点小启发,当然如果你有更好的解法或者是有什么不太明白的地方也可以私信博主,博主很期待和你一起加油一起成长。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件

文章目录 前言NetworkAnimatorAnimator的Trigger属性服务器权威模式&#xff08;Server Authoritative Mode&#xff09;客户端权威模式 (Owner Authoritative Mode)学习文档 前言 这个组件是NetCode常用的组件之一&#xff0c;NetworkAnimator跟NetworkTransform一样&#xf…

【Spring篇】使用注解进行开发

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;原代码&#xff08;无注解&#xff09;&#x1f384;加上注解⭐两个注…

八股文-TCP的四次挥手

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它的连接的建立和关闭过程都是经过精心设计的。在TCP连接关闭时&#xff0c;使用四次挥手来保证数据的完整传输和连接的正常终止。 漫画TCP的四次挥手 第一次挥手&#…

美国服务器:全面剖析其主要优点与潜在缺点

​  服务器是网站搭建的灵魂。信息化的今天&#xff0c;我们仍需要它来为网站和应用程序提供稳定的运行环境。而美国作为全球信息技术靠前的国家之一&#xff0c;其服务器市场备受关注。那么&#xff0c;美国服务器究竟有哪些主要优点和潜在缺点呢? 优点 数据中心基础设施&a…

亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight

目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…

Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic

目录 Bitmaps简介常用命令bitmaps与set比较 HyperLoglog简介命令 Geographic简介命令 Bitmaps 简介 位操作字符串。 现代计算机使用二进制&#xff08;位&#xff09;作为信息的基本单位&#xff0c;1个字节等于8位&#xff0c;例如“abc”字符串是有3个字节组成&#xff0c…

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;快速幂-递归方法二&#xff1a;快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…

一文总结MySQL的指令是如何工作的

当你输入一条MySQL指令时候有没有想过会发生什么&#xff1f; 建立连接 首先你得先连到数据库上才行&#xff0c;这又分为长连接和短链接&#xff0c;短链接就是你查询一次就断开连接&#xff0c;长连接是你可以多次查询直到主动断开连接&#xff08;也可能被杀死进程&#x…

基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302计时显示年月日时分秒。 3、按键可以弹奏以及播放音乐&#xff0c;内置16首音乐。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /时钟显示**/ void init_1602_ds1302() { write…

RabbitMQ 集群和镜像队列

文章目录 一、clustering(集群)1、使用集群的原因2、搭建步骤2.1、拉取镜像2.2、创建三个RabbitMQ容器节点2.3、集群搭建 二、镜像队列1、使用镜像的原因2、搭建步骤 总结 一、clustering(集群) 1、使用集群的原因 如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等…

string类的总结

目录 1.为什么要学习string类 2.string的标准库 3.string类的常用接口说明 1.string类对象的常见构造 2.string类对象的容量操作 3.string类对象的3种遍历方法 3.1 [ ] 下标 3.2 基于范围的for循环 3.3 迭代器 4 string类对象的元素访问 4.1 operator[]&#xff1a; 4.…

【LearnOpenGL基础入门——3】绘制纯色三角形

目录 一.写在前面 二.顶点输入 三.顶点着色器 四.编译着色器 五.片段着色器 六.着色器程序 七.链接顶点属性 彩蛋 一.写在前面 我们先认识一下OpenGL常用的几个名词&#xff1a; 顶点数组对象&#xff1a;Vertex Array Object&#xff0c;VAO顶点缓冲对象&#xff1a;…

mysql客户端navicat的一些错误合集

关于mysql的客户端的使用的一些问题 问题描述&#xff1a; 在使用navicat prenium客户端的时候&#xff0c;连接数据库出现 Table ‘performance_schema.session_variables’ doesn’t exist 错误 解决方案&#xff1a; 首先找到mysql的bin目录 然后winR 进入到cmd界面 输入…

数据库迁移(DBeaver版本)

最近需要做一个数据库迁移&#xff0c; 测试环境开发的差不多了&#xff0c;需要将脚本迁移到生产。 中间了试了一些工具&#xff0c;比如Jetbrain出品的datagrip&#xff0c;这个数据库工具平时还是很好用的&#xff0c;但是数据迁移感觉不是那么好用&#xff0c;所以还是用到…

二元分类模型评估方法

文章目录 前言一、混淆矩阵二、准确率三、精确率&召回率四、F1分数五、ROC 曲线六、AUC&#xff08;曲线下面积&#xff09;七、P-R曲线类别不平衡问题中如何选择PR与ROC 八、 Python 实现代码混淆矩阵、命中率、覆盖率、F1值ROC曲线、AUC面积 指标 公式 意义 真正例 (TP)被…

图像分类系列(三) GoogLeNet InceptionV1学习详细记录

前言 ​ 在上一期中介绍了VGG&#xff0c;VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩&#xff0c;而今天要介绍的就是同年分类任务的第一名——GoogLeNet 。 ​ 作为2014年ImageNet比赛冠军&#xff0c;GoogLeNet 比VGG更深的网络&#xff0c;比Alex…

虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火

一、故障现象 一辆2015款奔驰G63AMG车&#xff0c;搭载157发动机&#xff0c;累计行驶里程约为9.4万km。车主反映&#xff0c;该车低速行驶时&#xff0c;发动机偶尔会自动熄火&#xff0c;故障大概1个星期出现1次。 二、故障诊断 接车后路试&#xff0c;故障未能再现。用故障检…

MyBatis查询数据库(全是精髓)

1. 什么是MyBatis&#xff1f; 简单说&#xff0c;MyBatis就是一个完成程序与数据库交互的工具&#xff0c;也就是更简单的操作和读取数据库的工具。 2. 怎么学习Mybatis Mybatis学习只分为两部分&#xff1a; 配置MyBatis开发环境使用MyBatis模式和语法操作数据库 3. 第一…

【Gradle构件工具深度学习】

Gradle构件工具深度学习 1. 课程大纲1.1 Gradle入门1.2 与Idea整合1.3 Gradle进阶 2. 常见项目构建工具3. 安装gradle 1. 课程大纲 1.1 Gradle入门 基本介绍、常用指令、项目目录、项目应用 1.2 与Idea整合 Groovy语法、整合IDEA、搭建web工程、项目部署 1.3 Gradle进阶 生命周…

springboot jar包 无法读取静态资源文件

springboot jar包 无法读取静态资源文件 参考 springboot项目读取resources目录下的文件的9种方式 Resource resource resourceLoader.getResource("classpath:static/jkbw/jkbw4.txt");try{InputStream inputStream resource.getInputStream();BufferedReader r…