文章目录
- 检测字符串是否为回文
- 最后一个单词的长度
- 第一个只出现一次的字符
- 检测字符串是否为回文
解题思路
验证回文串一般解法都是双指针,而且是使用头尾指针,头指针指向字符串的第一个元素,尾指针指向字符串的最后一个元素,从字符串两端往中间遍历和比较。本题的关键在于字符串是由 ASCII 字符组成,而我们验证时只需要考虑字母和数字字符,因此要把其他字符过滤掉
题解:
class Solution {
public boolean isPalindrome(String s) {
// 左指针
int left = 0;
// 右指针
int right = s.length() - 1;
// 左右指针分别从前和从后往中间移动
while (left < right) {
char c1 = s.charAt(left);
char c2 = s.charAt(right);
if (!Character.isLetterOrDigit(c1)) {
// 过滤掉非字母和数字字符
left++;
continue;
}
if (!Character.isLetterOrDigit(c2)) {
// 过滤掉非字母和数字字符
right--;
continue;
}
// 忽略字母大小写
if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
return false;
}
// 挪动指针
left++;
right--;
}
return true;
}
}
- 最后一个单词的长度
方法一(指针)
解题思路
定义一个指针变量。
从后往前遍历字符串,当遇到空格时,用指针记录位置信息,并终止循环。
总长度减去指针到开头一段的长度,即得到最后一个单词的长度。
题解:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
//标准输入
Scanner sc=new Scanner(System.in);
//键盘输入字符串
String s=sc.nextLine();
//定义指针变量
int index=-1;
for(int i=s.length()-1;i>=0;i--){
//从后往前第一个空格的位置
if(s.charAt(i)==' '){
index=i;
break;
}
}
//总长度减去指针到开头一段的长度,即得到最后一个单词的长度
System.out.println(s.length()-index-1);
}
}
方法二(字符串分割)
解题思路
通过split函数将原字符串分割为字符串数组。
字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度。
题解:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
//标准输入
Scanner sc=new Scanner(System.in);
//键盘输入字符串
String s=sc.nextLine();
//以空格分割为字符串数组
String[] arr=s.split(" ");
//字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度
System.out.println(arr[arr.length-1].length());
}
}
- 第一个只出现一次的字符
1 <= s.length <= 105
s 只包含小写字母
解题思路
1.统计各个字符出现次数
定义一个计数数组count[],遍历字符数组,如果字符出现多次,则count++
2.重新遍历字符数组
重新遍历一次 字符数组,如果发现「它」只出现一次,直接返回对应的下标,否则循环终止之后返回 -1
题解:
public int firstUniqChar(String s){
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
count[ch-'a'] ++;
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(count[ch-'a'] == 1){
return i;
}
}
return -1;
}