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

这篇具有很好参考价值的文章主要介绍了JAVA刷题之字符串的一些个人思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

感谢您的阅读!

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

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

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

一.把字符串转换成整数

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

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;
    }
}

二..字符串相加

JAVA刷题之字符串的一些个人思路,java,开发语言,算法首先我们可以从下图看到例如字符串“12345” 和“12”是如何相加的

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

我们可以看出两个字符串相加是从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();
    }
}

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

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

二.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);
    }
}

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

三.验证回文串

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

还是和前面几题一样我们先确定自己的总体思路:首先比较字符串是否回文,我们了可以设定头部元素和尾部元素,进行动态移动然后比较是否相等,因为要忽视非字母数字字符,我们可以用到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;
    }
}

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

JAVA刷题之字符串的一些个人思路,java,开发语言,算法

四.说明

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

到了这里,关于JAVA刷题之字符串的一些个人思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试真题 Java 实现【挑选字符串】【2023 B卷 100分】,附详细解题思路

    本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。 刷的越多,抽中的概率越大 ,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。 专栏福利 :限时订

    2024年02月16日
    浏览(48)
  • 算法刷题-字符串-左旋转字符串

    反转个字符串还有这么多用处? 力扣题目链接 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋转两位得到的结果\\\"cdefgab\\\"。 示例 1: 输入: s = “abcde

    2024年02月09日
    浏览(48)
  • 华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路

    输入两个字符串a和b,都只包含英文小写字母。 a长度=100,b长度=500,000 。 判定a是否是b的有效子串。 判定规则: a中的每个字符在b中都能找到(可以不连续),且a在b中字符的前后顺序与a中顺序要保持一致。 (例如, a=”qwt” 是 b=”qwerty” 的一个子序列且有效字符是q、w、

    2024年02月08日
    浏览(44)
  • 算法刷题-字符串-反转字符串II

    简单的反转还不够,我要花式反转 力扣题目链接 给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,

    2024年02月09日
    浏览(49)
  • 算法刷题-字符串-重复的子字符串

    KMP算法还能干这个 力扣题目链接 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。 示例 2: 输入: “aba” 输出: False 示

    2024年02月09日
    浏览(53)
  • 算法刷题-字符串-翻转字符串里的单词

    综合考察字符串操作的好题。 力扣题目链接 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: “the sky is blue” 输出: “blue is sky the” 示例 2: 输入: \\\" hello world! \\\" 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不

    2024年02月09日
    浏览(102)
  • 华为OD机试真题 Java 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

    输入一个字符串,返回其最长的数字子串,以及其长度。 若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置)。 本题含有多组样例输入。 数据范围: 字符串长度 1≤n≤200 , 保证每组输入都至少含有一个数字。 输入一个字符串。 输出字符串中最长的数

    2024年02月08日
    浏览(55)
  • 【C语言】字符串---刷题篇

    Hi,C站的小伙伴们大家好呀!😊🥰,欢迎来阅读我的这一篇 【C语言】字符串基础刷题篇! 不知你是否和我一样,在刚刚接触到这块的知识时,总是会和这神圣的知识隔着隔着厚厚的一堵墙,迷茫的眼神中总是会露出不理解不理解😣😣(当时的状态……) 其实后来我就发现其实

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包