🎈本章节将介绍三道有关String类的OJ题(来自牛客,LeetCode)
🎉三道题分别是:
🎄(1)寻找字符串中唯一且不重复的字符
🎄(2)字符串中最后一个单词的字符长度
🎄(3)验证回文串
-------------------------------------------------------------------------------------------------------------------------
目录
🎇一、字符串中第一个唯一的字符
题目:
✨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)通过拆分的方法
✨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练习题,到这里就结束了。
学习编程不仅只学语法知识,还得通过不断练习思维能力和思考代码的能力,即使今天的三道练习题难度不算太大,但也得理解好其中的过程,对提高我们的能力很有帮助。
如果该博客内容对各位有所帮助,希望多多支持,谢谢各位大佬了!
如有不足,说错的地方,还望各位大佬们,能指点一二!