需求:
给定一个由大写字母组成的字符串,返回第一个单独出现的字母
分析:
1、思路一
创建HashMap集合,遍历字符串,将各个字母及对应的角标存到集合中,再次遍历字符串,看当前字符对应的角标和HashMap集合中的角标是否相同,如果相同就直接返回,如果不同,将HashMap集合中的角标改成该字母在字符串中的当前角标,继续遍历,如果没有单独出行的字母,就返回特殊标记代表没有该字母,比如返回'#'。
2、思路二
创建HashMap集合,遍历字符串,将各个字母出现的次数记录下来,再次遍历字符串,看map集合中该字母的个数是否是1,如果是就返回该字母,否则继续遍历。
3、思路三
创建int[]数组,记录各个字母的出现个数,大写字母共26,所以数组大小是26,假设A对应角标0,那么Z对应角标25。遍历字符串,更新int[]数组中该字符的个数,再次遍历字符串,看字符对应的个数是否是1,如果是就直接返回,否则继续遍历。
代码:
import java.util.*;
class UniqueChar{
//思路一
public static char getFirstUnique1(String str){
//创建HashMap集合,将字符串中各个字母和角标存到集合中
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
for(int i = 0; i < str.length(); i++){
hm.put(str.charAt(i), i);
}
//再次遍历字符串,看map集合中的角标和当前字符在字符串中的角标是否相同,如果相同直接返回,否则修改map集合中的值,继续遍历
for(int i = 0; i < str.length(); i++){
if(i == hm.get(str.charAt(i))){
return str.charAt(i);
}
else{
hm.put(str.charAt(i), i);
}
}
return '#';
}
//思路二
public static char getFirstUnique2(String str){
//创建HashMap集合,存储各个字母及出现的次数
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
//遍历字符串,将字母和出现的个数存到map集合中
for(int i = 0; i < str.length(); i++){
int count = 0;
if(hm.containsKey(str.charAt(i))){
count = hm.get(str.charAt(i));
}
hm.put(str.charAt(i), count+1);
}
//遍历字符串,返回出现个数是1的字母
for(int i = 0; i < str.length(); i++){
if(hm.get(str.charAt(i)) == 1){
return str.charAt(i);
}
}
return '#';
}
//思路三
public static char getFirstUnique3(String str){
//创建int[]数组,存储各个字母的个数
int[] result = new int[26];
//遍历字符串,更新int[]数组中的个数
for(int i = 0; i < str.length(); i++){
result[str.charAt(i)-'A'] += 1;
}
//遍历字符串,返回个数是1的字母
for(int i = 0; i < str.length(); i++){
if(result[str.charAt(i)-'A'] == 1){
return str.charAt(i);
}
}
return '#';
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String str;
while(scan.hasNext()){
str = scan.nextLine();
System.out.println(str+"字符串中第一个单独出现的字母是"+getFirstUnique1(str));
System.out.println(str+"字符串中第一个单独出现的字母是"+getFirstUnique2(str));
System.out.println(str+"字符串中第一个单独出现的字母是"+getFirstUnique3(str));
}
}
}