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--;}//先把字母转换成小写后比较如果不相等就返回falseelse if(Character.toLowerCase(chS)!=Character.toLowerCase(chE)){return false;}//如果相等就动态移动else{start++;end--;}}
//如果头部指针等于尾部指针就说明这个字符串以及遍历完成了,形成回文 返回truereturn 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,所以可能有些地方的解法不是最优解,还有很大的进步空间,希望看完之后可以对你可以有一点小启发,当然如果你有更好的解法或者是有什么不太明白的地方也可以私信博主,博主很期待和你一起加油一起成长。 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十一周阅读记录

Neural Scene Graphs for Dynamic Scenes&#xff1a;动态场景的神经场景图 提出了一种将动态场景分解为场景图的神经渲染方法。提出了一种学习的场景图表示&#xff0c;它编码了物体的变换和辐射&#xff0c;以便高效地渲染场景的新排列和视图。为此&#xff0c;隐式学习场景…

leetcode34.排序数组中查找元素第一个和最后一个位置两种解题方法(超详细)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envTypelist&envIdZCa7r67M这道题&#xff0c;读者可能会说这道题有什么好…

系列十一、你平时工作用过的JVM常用基本配置参数有哪些?

一、常用参数 1.1、-Xms 功能&#xff1a;初始内存大小&#xff0c;默认为物理内存的1/64&#xff0c;等价于 -XX:InitialHeapSize 1.2、-Xmx 功能&#xff1a;最大分配内存&#xff0c;默认为物理内存的1/4&#xff0c;等价于 -XX:MaxHeapSize 1.3、-Xss 功能&#xff1a;设置…

C++--哈希表--散列--冲突--哈希闭散列模拟实现

文章目录 哈希概念一、哈希表闭散列的模拟实现二、开散列(哈希桶)的模拟实现数据类型定义析构函数插入查找删除 哈希概念 unordered系列的关联式容器之所以效率比较高&#xff0c;是因为其底层使用了哈希结构。 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没…

HTML5+CSS3+JS小实例:使用L2Dwidget实现二次元卡通看板娘

实例:使用L2Dwidget实现二次元卡通看板娘 技术栈:HTML+CSS+JS 效果: 源码: <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

【沐风老师】3DMAX一键云生成器插件使用教程

3DMAX云生成器插件使用教程 3DMAX云生成器插件&#xff0c;是一款将物体变成云的简单而富有创意的工具。该工具通过在物体周围创建粒子结合材质&#xff0c;最终形成渲染后的云的效果。 【支持版本】 3dMax2018 – 2023 默认的扫描线渲染器 【安装方法】 1.复制“安装文件”…

4种经典的限流算法

0、基础知识 1000毫秒内&#xff0c;允许2个请求&#xff0c;其他请求全部拒绝。 不拒绝就可能往db打请求&#xff0c;把db干爆~ interval 1000 rate 2&#xff1b; 一、固定窗口限流 固定窗口限流算法&#xff08;Fixed Window Rate Limiting Algorithm&#xff09;是…

​软考-高级-系统架构设计师教程(清华第2版)【第14章 云原生架构设计理论与实践(P496~526)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第14章 云原生架构设计理论与实践&#xff08;P496~526&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

利用SD存储介质扩展MAXQ20000的非易失性数据存储空间

SD存储卡是一种可移动存储介质&#xff0c;通常用于相机、手机、平板电脑等设备中存储照片、视频、音乐等数据。SD存储卡的全称为Secure Digital Memory Card&#xff0c;是由SD Card Association制定的一种标准格式。它具有体积小、存储容量大、读写速度快、价格低廉等优点。目…

java游戏制作-拼图游戏

一.制作主界面 首先创建一个Java项目命名为puzzlegame。 再在src中创建一个包&#xff0c;用来制作主界面 代码&#xff1a; 结果&#xff1a; 二.设置界面 代码&#xff1a; 三.初始化界面 代码&#xff1a; 优化代码&#xff1a; 结果&#xff1a; 四.添加图片 先在Java项…

三相异步电机动态数学模型及矢量控制仿真

文章目录 三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接需要仿真的同学请关注【Qin的学习营地】 三相…

c++ list容器使用详解

list容器概念 list是一个双向链表容器&#xff0c;可高效地进行插入删除元素。 List 特点&#xff1a; list不可以随机存取元素&#xff0c;所以不支持at.(position)函数与[]操作符。可以对其迭代器执行&#xff0c;但是不能这样操作迭代器&#xff1a;it3使用时包含 #includ…