在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
这题也算一个简单题了。
直接统计每个单词出现的次数,然后从头开始扫到第一个次数为1
的返回就可以了。
因为字母ascii
在65 ~ 122
,所以开一个58
的数组就可以了。
public class Solution {
public int FirstNotRepeatingChar(String str) {
if (str == null || str.length() == 0) return -1;
int[] counts = new int[58]; // 65('A') ~ 122 'z'
for (int i = 0; i < str.length(); i++)
counts[str.charAt(i) - 'A']++;
for (int i = 0; i < str.length(); i++)
if (counts[str.charAt(i) - 'A'] == 1)
return i;
return -1;
}
}
也可以用Map的写法:
import java.util.*;
public class Solution {
public int FirstNotRepeatingChar(String str) {
if (str == null || str.length() == 0) return -1;
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++)
map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0) + 1);
for (int i = 0; i < str.length(); i++)
if (map.get(str.charAt(i)) == 1)
return i;
return -1;
}
}