感谢您的阅读!
꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ ა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字符串相加扩展:
博主做完这道题,又自己给自己做了一个假设,如果两个数可以为负数该如何解呢
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; //去除正号 boolean isNegative3 = num1.charAt(0) == '+'; boolean isNegative4 = num2.charAt(0) == '+'; num1 = isNegative3 ? num1.substring(1) : num1; num2 = isNegative4 ? num2.substring(1) : num2; boolean isNegativeResult = false; if ((isNegative1 && !isNegative2) || (!isNegative1 && isNegative2)) { // 如果两个数的符号不同,则结果的符号与数值大的那个相同 if (isNegative1) { return subtract(num2, num1); } else { return subtract(num1, num2); } } else if (isNegative1 && isNegative2) { // 如果两个数都是负数,则结果的符号为负 isNegativeResult = true; } 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); } return (isNegativeResult ? "-" : "") + result.reverse().toString(); } private String subtract(String num1, String num2) { if(num1.equals(num2)) { return "0"; } int n1 = Integer.parseInt(num1); int n2 = Integer.parseInt(num2); int result = n1-n2; return Integer.toString(result); } }
如果你有更好的解法也可以私信博主哦,大家一起讨论
三.验证回文串
还是和前面几题一样我们先确定自己的总体思路:首先比较字符串是否回文,我们了可以设定头部元素和尾部元素,进行动态移动然后比较是否相等,因为要忽视非字母数字字符,我们可以用到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,所以可能有些地方的解法不是最优解,还有很大的进步空间,希望看完之后可以对你可以有一点小启发,当然如果你有更好的解法或者是有什么不太明白的地方也可以私信博主,博主很期待和你一起加油一起成长。