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