「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。复制代码
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍LeetCode题目 字符串中的第一个唯一字符 的一些解法和思路。
【题目】
【解法一】
【思路】
- 设置长度为26的数组,记录每个字符出现的次数
- 遍历字符串,统计每个字符出现的次数,放到数组中。
- 再次遍历字符串,如果某个字母对应的数组的值为1,即为符合条件,直接返回。
- 如果没有遇到,返回-1.
【代码】
public static int firstUniqChar(String s){
/*
解法1:使用一个长度为26的数组进行计数
*/
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
int index = s.charAt(i)-'a';
count[index]+=1;
}
for (int i = 0; i < s.length(); i++) {
int index = s.charAt(i)-'a';
if(count[index]==1){
return i;
}
}
return -1;
}
【解法二】
【思路】
- 设置hashmap,保存每个字符出现的次数。
其余步骤和使用数组类似,这里就不再具体解释。
【代码】
public static int firstUniqChar(String s){
/*
解法2:哈希表 字母保存为k,出现的次数保存为value,思想和使用数组相同
*/
Map<Character, Integer> map = new HashMap();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
map.put(ch,map.getOrDefault(ch,0)+1);
}
for (int i = 0; i < s.length(); i++) {
if(map.get(s.charAt(i))==1){
return i;
}
}
return -1;
}
【解法三】
【思路】
该解法比较取巧,使用了java内置的api,indexof(返回该字母第一次出现的索引)和lastindexof(返回该字母最后一次出现的索引)方法,如果两者的返回值相同,表示该元素只有一个。
【代码】
public static int firstUniqChar(String s){
/*
解法3:如果indexof和lastindexof相同,那么这个元素肯定只有一个
*/
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(s.indexOf(ch)==s.lastIndexOf(ch)){
return i;
}
}
return -1;
}
【解法四】
【思路】
直接求解
嵌套两层循环,依次遍历字符串的每个字符,内层循环用来判断是否该字符符合题意,并且在外层循环中设置标记,决定是否要结束循环。
【代码】
public static int firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++) {
boolean flag=true;
for (int j = 0; j < s.length(); j++) {
if(s.charAt(i)==s.charAt(j) && i!=j){
flag=false;
}
}
if(flag){
return i;
}
}
return -1;
}
小结
以上就是关于该题的四种解法,第三种解法比较取巧,但是需要我们对于相对应的方法比较了解,希望以上内容能对读者有所帮助,如有不正之处,欢迎留言指正。