上一篇介绍完String类,这里找到了几道关于字符串的题目,来熟悉下String类方法在解题过程中的使用
目录
1.第一个只出现一次的字符
题目说明字符串s中只包含小写字符
思路:
新建一个int数组,数组的0下标表示字母a,1下标表示祖母b,以此类推。
遍历字符串,字母出现一次就让int数组对应的下标的元素的值+1。
再次遍历字符串,若int数组对应的下标的元素的值为1,返回字符串下标
代码如下:
class Solution {
public int firstUniqChar(String s) {
int len=s.length();
char[] c=s.toCharArray(); //这里为方便使用,所以把字符串转为字符数组
int[] arr=new int[26];
int i=0;
for(i=0;i<len;++i) {
arr[c[i]-'a']++; //c[i]-'a'的值就是int数组中字母对应的下标
}
for(i=0;i<len;++i) {
if(arr[c[i]-'a']==1) {
return i;
}
}
return -1;
}
}
2.字符串最后一个单词的长度
思路:
这题用String类中的两个方法就可以完成
length()是获取字符串的长度
LastIndexOf()是从后往前找指定的值第一次出现的位置
所以使用LastIndexOf()从后往前找空格第一次出现的位置,然后字符串长度减去此位置再-1就是最后一个单词的长度
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s=scan.nextLine();
System.out.println(s.length()-s.lastIndexOf(" ")-1);
}
}
3.验证回文串
思路:
核心依旧是双指针的思想,不过我们需要对字符串做一些改动
题目说明忽略字母的大小写,所以我们首先把字符串中的字母全部换成大写,其次需要写一个方法来判断字母是否符合题目要求(即是字母或数字字符)
之后就是双指针的思路了,这里就不再多讲了
代码如下:
class Solution {
public boolean isLegal(char c) {
if((c>='A'&&c<='Z')||('0'<=c&&c<='9')) {
return true;
} else {
return false;
}
}
public boolean isPalindrome(String s) {
String s2=s.toUpperCase();
int i=0;
int j=s2.length()-1;
while(i<=j) {
while(isLegal(s2.charAt(i))==false&&i<j) {
i++;
}
while(isLegal(s2.charAt(j))==false&&i<j) {
j--;
}
if(s2.charAt(i)==s2.charAt(j)) {
i++;
j--;
} else {
return false;
}
}
return true;
}
}
4.字符集合
思路:
定义一个String类s
一个和简单的判断方法:i== s.IndexOf(s.charAt(i))
charAt()是获取i下标的字符,IndexOf是查找指定的值第一次出现的位置。
二者结合就是查找i下标的字符第一次出现的位置,如果这个位置和i相等,我们就输出这个字符,然后找下一个,否则就直接找下一个
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
while(scan.hasNext()) { //多组输入
String s=scan.nextLine();
int i=0;
while(i<s.length()) {
if(i==s.indexOf(s.charAt(i))) {
System.out.print(s.charAt(i));
++i;
} else {
++i;
}
}
System.out.printf("\n");
}
}
}
例题就到这,完