???? 算法题 ???? |
---|
???? 算法题 ???? |
---|
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例1:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
提示:
用数组存放当前字符串中各字符数量
代码:
public class Solution {
public int FirstUniqChar(string s) {
int[] arr=new int[26]; //26个字母的数组
for(int i=0;i<s.Length;i++)
{
arr[s[i]-'a']+=1; //a--0 b--1………… 对应位置数字+1
}
for(int i=0;i<s.Length;i++)
{
if(arr[s[i]-'a']==1) //当该位置数字为1
{
return i;
}
}
return -1;
}
}
执行结果
通过
执行用时:64 ms,在所有 Java 提交中击败了99.50%的用户
内存消耗:43.4 MB,在所有 Java 提交中击败了16.50%的用户
思路解析 可以对字符串进行两次遍历。
在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。
在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回 −1。
代码:
class Solution {
public int firstUniqChar(String s) {
Map<Character, Integer> frequency = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
frequency.put(ch, frequency.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < s.length(); ++i) {
if (frequency.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
}
执行结果
通过
执行用时:26 ms,在所有 Java 提交中击败了39.26%的用户
内存消耗:38.2 MB,在所有 Java 提交中击败了88.05%的用户
复杂度分析
时间复杂度:O( n )
空间复杂度:O( |Σ|)
C#
和 Java
两种编程语言进行解题