【算法日记】String:字符串中的第一个唯一字符,字符串最后一个单词的长度,验证回文串,字符串中的单词数
📅 2026/7/19 10:41:48
👁️ 阅读次数
📝 编程学习
文章目录
- 一、字符串中的第一个唯一字符(LC387)
- 题目描述
- 解题思路
- 代码实现
- 二、字符串最后一个单词的长度(HJ1)
- 题目描述
- 解题思路
- 代码实现
- 三、验证回文串(LC125)
- 题目描述
- 解题思路
- 代码实现
- 四、字符串中的单词数(LC434)
- 题目描述
- 解题思路
- 代码实现
- 五、程序运行结果
- 题目描述
- 解题思路
一、字符串中的第一个唯一字符(LC387)
字符串中的第一个唯一字符
题目描述
解题思路
- 定义
count数组记录每个字符出现次数。字符本质就是ASCII码,减去'a'便于下标从0开始记录,这样数组容量为26就够用了。 - 遍历字符串,第一个
count数组内元素值为1的就是首个出现一次的字符。
代码实现
publicintfirstUniqChar(Strings){int[]count=newint[26];for(inti=0;i<s.length();i++){charch=s.charAt(i);count[ch-'a']++;}for(inti=0;i<s.length();i++){charch=s.charAt(i);if(count[ch-'a']==1)returni;}return-1;}二、字符串最后一个单词的长度(HJ1)
题目描述
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
解题思路
- 将句子按空格分割成单词数组,最后取数组的最后一个单词,返回其长度。
- 找到倒数第一个空格的索引,截取尾部字符串再返回长度
代码实现
- 思路1:
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);Stringstr=scan.nextLine();String[]strArr=str.split(" ");System.out.println(strArr[strArr.length-1].length());System.out.println(len);}}- 思路2
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);Stringstr=scan.nextLine();intindex=str.lastIndexOf(" ");intlen=str.substring(index+1).length();System.out.println(len);}}注意:计算字符串长度需要调用length()方法,计算数组长度使用length属性
三、验证回文串(LC125)
验证回文串
题目描述
解题思路
- 预处理字符串:首先将字符串中的所有大写字符转换为小写字符,并过滤掉所有非字母数字字符,得到一个只包含小写字母和数字的新字符串。
- 验证回文:使用双指针法,一个指针从字符串开头开始,另一个指针从字符串结尾开始,先判断是否为数字或字母,如果不是则跳过。验证通过则依次比较两个指针所指向的字符是否相同。如果所有对应位置的字符都相同,则是回文串,否则不是。
代码实现
publicclassSolution{booleanisCharOrDigit(charch){if(Character.isLetter(ch)||Character.isDigit(ch)){returntrue;}returnfalse;}publicbooleanisPalindrome(Strings){s=s.toLowerCase();intl=0;intr=s.length()-1;while(l<r){while(l<r&&!isCharOrDigit(s.charAt(l))){l++;}while(l<r&&!isCharOrDigit(s.charAt(r))){r--;}if(s.charAt(l)==s.charAt(r)){l++;r--;}else{returnfalse;}}returntrue;}}四、字符串中的单词数(LC434)
字符串中的单词数
题目描述
解题思路
调用
split()按空格分割成数组
注意:多个空格连在一起时也会被分割为""定义计数器
count,遍历数组,当长度不为0才计数
代码实现
publicintcountSegments(Strings){intlen=s.length();if(len==0)return0;intcount=0;Stringss[]=s.split(" ");for(Stringr:ss){if(r.length()!=0)count++;}returncount;}五、程序运行结果
题目描述
指出下列程序运行的结果:
publicclassExample{Stringstr=newString("good");char[]ch={'a','b','c'};publicstaticvoidmain(Stringargs[]){Exampleex=newExample();ex.change(ex.str,ex.ch);System.out.print(ex.str+" and ");System.out.print(ex.ch);}publicvoidchange(Stringstr,charch[]){str="test ok";ch[0]='g';}}解题思路
change传入的都是引用,形参也指向原来的地址。- 区别在于:一个修改了形参的指向,另一个通过形参修改了实参的值。
string类是不可变的,只能新建一个string类,此时形参str不再指向good,而指向了test ok,但实参str依旧指向good,没有改变。ch[]没有改变指向,直接修改了实参的值。
- 此时实参
str没有改变变化,ch[0]改变。
输出结果:good and gbc
编程学习
技术分享
实战经验