Java中有关String类的三道OJ题

🎈本章节将介绍三道有关String类的OJ题(来自牛客,LeetCode)

🎉三道题分别是:

        🎄(1)寻找字符串中唯一且不重复的字符

        🎄(2)字符串中最后一个单词的字符长度

        🎄(3)验证回文串

-------------------------------------------------------------------------------------------------------------------------

目录

🎇一、字符串中第一个唯一的字符

✨1、思路分析

✨2、代码分析 

✨3、代码提交

🎇二、字符串中最后一个单词的长度

 ✨1、思路分析

 ✨2、代码分析

(1)第一种方法(截取):

(2)第二种方法(拆分):

🎇三、验证回文串

 ✨1、思路分析

 ✨2、代码分析


 

🎇一、字符串中第一个唯一的字符

题目:

✨1、思路分析

由题目条件和提示,可以得知本题的具体要求。

由于提示了s只包含小写字母,那我们就不必考虑大小写的问题了,得出结果后返回对应的字符下标。

🤔那我们得从哪方面开始着手解题呢?

(1)要知道字符串中存在的不重复字符,我们需要遍历字符串中的每一个字符,才能确定哪些字符只存在一次,但这又会引出一个问题,我们得如何确定哪些是已经重复的字符?

(2)题目要求的是找到“第一个”不重复的字符,因此再我们找到字符串里面所有不重复的字符后,还得根据字符串的下标顺序,找到第一个唯一的字符

  • 为了字符串中的每一个字符,我们不妨通过一个循环,把字符串中的每一个字符提取出来放到一个数组里面。如果再提取的时候又遇到相同的字符,则对前一个已存在的数组元素进行叠加操作。
  • 处理好字符串的提取工作后,只需通过判断字符串对应在数组中哪些是没经过叠加操作的元素,最后返回下标位置即可。

🎊代码示例

此处以字符串String str="leetcode"为示例演示


 

✨2、代码分析 

我们知道此题条件中要求字符串s只考虑小写字母。

(1)第一步:

  • 首先要对字符串进行遍历提取到一个数组下标中【注意:确定字符串长度的.length()是String类中的方法,记得加括号调用】
  • 而字符中只有小写字母,我们可以创建一个有26个元素数量的数组,在遍历字符串的时候,将字符以a~z的下标顺序存入数组从下标0到下标25的位置。(让其数组从0到25的位置对应时a到z的位置)
  • 为了提取字符串中每一个字符,我们可以用Sting类中的方法-----charAt(i:下标位置)
  • 通过charAt提取出来的是一个字符,为了将字符准确存放到数组对应的字母位置去,又因为小写字母的编码是97~122,那么我们可以将提取到字符减去97,即可按顺序的存放到数组中。 

 

 

 

(2)第二步: 

  • 在遍历的途中对整型数组进行自增标记+1。
  • 当再一次遇到相同的字符,会在对应的下标位置元素继续+1,这时重复出现的字符,在数组对应的位置即被标记为2;未重复出现的字符,对应的是1。

 简单以一个“abcab”为例:

此时即可知道只有c是唯一重复的字符 

(3)第三步:

  • 对字符串再进行一次遍历

        【注意:不是对数组进行遍历,数组对应的顺序是从‘a’到‘z‘,要按字符串的顺序开始寻找第一个唯一的字符】 

  • 通过第一步和第二步后,字符串中所有重复的字符,在数组对应下标中的元素已经不是1,通过一个if语句进行判断。
  • 当遍历过程中判断到一个对应下标元素为1时,即说明此位置的数组对应的字符只出现一次,那么直接输出其在字符串中的下标位置即可。 
  • 当第二次遍历结束后,如果所有的字符都是重复的,那么输出不存在唯一重复字符的语句。
public class TestDemo3 {
    public static void main(String[] args) {
        String str="leetcode";
        char []arr=new char[26];
        for (int i = 0; i < str.length(); i++) {
            arr[(str.charAt(i)-'a')]++;
        }
        for (int i = 0; i < str.length(); i++) {
            if(arr[(str.charAt(i)-'a')]==1){
                System.out.println(i);
                return;
            }
        }
        System.out.println("不存在唯一的不重复字符");
    }
}

3、代码提交

 


🎇二、字符串中最后一个单词的长度

题目:

 ✨1、思路分析

这道题其实要求很简单,没有什么硬性要求,只需注意字符串末尾不能以空格为结尾。

 刚上手这道题,可以联想到两种简单地解题方法:

  1. 通过拆分的方式,将该字符串以空格为指定的分割符进行拆开,然后选取最后一个字符串进行判断长度即可;
  2. 也可以通过截取的方式,将最后一个字符串截取出来。

代码示例: 

(1)通过截取的方法

 (2)通过拆分的方法

 


 ✨2、代码分析

(1)第一种方法(截取):

字符串的截取涉及到substring()和trim()

 substring用来截取部分内容:       

        语法格式:String substring(int beginIndex起始下标, int endIndex结束下标)【截取部分内容】

trim可以消除字符串左右两边的空格,保留中间的空格

        trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).

  • 首先通过自己输入一个字符串后,使用lastindexOf()从末尾到开头寻找空格的下标位置,该空格即为最后一个字符串前的空格。
  • 找到后记得对空格下标位置+1,毕竟我们截取的时候,不包括该空格,截取的是最后一个字符串中的内容, 截取的结束下标为字符串的长度(本应该减1的,毕竟对应数组下标位置得减-1,可由于substring()是前闭后开的).

 【注意】:注意前闭后开区间的写法, substring(ret1.substring(" ")+1, ret1.length()) 表示包含 空格下标, 不包含 字符串末尾下标。

         

 


(2)第二种方法(拆分):

字符串的拆分涉及到split();

字符串的拆分:

        可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

语法格式:

        String[] split(String regex)------将字符串全部拆分

【注意】:拆分后会将拆分出来的每一个字符串存在字符串数组内

  • 以空格作为分隔符对输入的字符串进行拆分
  • 拆分后选取字符串数组的最后一个元素进行字符串长度输出即可 

 

 

 


🎇三、验证回文串

题目:

 ✨1、思路分析

通过题目了解,该题中只考虑数字和字母,可以忽略大小写字母的区分。

因此,我们只需关注字符串中的数字和字母即可,当遇见像空格或逗号之类的字符时,直接跳过忽略。

  • 首先,我们可以先忽略字符串中大小写不一样的问题,可以将字符串统一成大写的或统一成小写的
  • 之后设置一个位置变量为字符串的最左侧,一个变量为字符串最右侧。
  • 通过前后字符的比较确定是否符合回文,当遇见不符合的,直接返回false;如遇见非数组字母的字符时,则跳过,继续向下一个位置的字符进行比较,

代码示例: 

class Soulution{
    private boolean ignore(char ch){
        if(ch>='a'&&ch<='z'||ch<='9'&&ch>='0'){
            return true;
        }else{
            return false;
        }
    }
    public boolean isPalindrome(String s){
        s=s.toLowerCase();
        int first=0,last=s.length()-1;
        while(first<last){
            while(first<last&&!ignore(s.charAt(first))){
                first++;
            }
            while(first<last&&!ignore(s.charAt(last))){
                last--;
            }
            if(s.charAt(first)==s.charAt(last)){
                first++;
                last--;
            } else{
                return false;
            }
        }
        return true;

    }
}
public class TestDemo2 {
    public static void main(String[] args) {
        Soulution soulution=new Soulution();
        String ret="A man, a plan, a canal: Panama";
        boolean rets=soulution.isPalindrome(ret);
        System.out.println(rets);
    }
}

 ✨2、代码分析

  • 该题中的字符串回文判断是在类中进行的,首先定义一个成员方法,判断字符串中遇到非数字或非字母的字符时的处理
  • 先将字符串统一成小写的
  • 之后定义一个起始值first和一个末尾值last【注意:末尾值是字符串长度-1,对应字符串下标的字符位置】
  • 对起始值和末尾值先进行判断是否符合first<last,而且还得符合对应字符是数字或字母,而非空格或其他字符,若是则first或last++,再继续判断.
  • 将起始值和末尾值对应的字符进行比较,当起始值大于或等于末尾值时),比较结束;或当起始值不等于末尾值时,返回false

 

 

 

 代码提交结果:

 

 


🎊今天的3道有关String类的OJ练习题,到这里就结束了。

学习编程不仅只学语法知识,还得通过不断练习思维能力和思考代码的能力,即使今天的三道练习题难度不算太大,但也得理解好其中的过程,对提高我们的能力很有帮助。

如果该博客内容对各位有所帮助,希望多多支持,谢谢各位大佬了!

如有不足,说错的地方,还望各位大佬们,能指点一二!

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星河栀染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值