【算法日记】String:字符串中的第一个唯一字符,字符串最后一个单词的长度,验证回文串,字符串中的单词数

文章目录

  • 一、字符串中的第一个唯一字符(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. 将句子按空格分割成单词数组,最后取数组的最后一个单词,返回其长度。
  2. 找到倒数第一个空格的索引,截取尾部字符串再返回长度

代码实现

  • 思路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)

验证回文串

题目描述

解题思路

  1. 预处理字符串:首先将字符串中的所有大写字符转换为小写字符,并过滤掉所有非字母数字字符,得到一个只包含小写字母和数字的新字符串。
  2. 验证回文:使用双指针法,一个指针从字符串开头开始,另一个指针从字符串结尾开始,先判断是否为数字或字母,如果不是则跳过。验证通过则依次比较两个指针所指向的字符是否相同。如果所有对应位置的字符都相同,则是回文串,否则不是。

代码实现

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)

字符串中的单词数

题目描述

解题思路

  1. 调用split()按空格分割成数组
    注意:多个空格连在一起时也会被分割为""

  2. 定义计数器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