面试题50:第一个只出现一次的字符
在一个字符串(0 <= 字符串长度 <= 10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置,如果没有则返回-1
方法一:
将字符串从第一个字符开始往后扫描字符串中的每个字符,若后面的字符串中没有发现重复的字符,那么这个字符就是只出现一次的字符
但该种方法的时间复杂度为O(n^2),因此要想一种更加高效的方法,使用一种容器来装载每个字符元素出现的次数
方法二:
那么就想到使用HashMap来解决这个问题,因为HashMap就可以将一个字符串映射成一个数字
核心主要思路:判断HashMap中是否包含某元素,
若包含该元素,将该元素插入到哈希表中,并取出上一个包含元素对应的value值,并加1
若不包含该元素,将该元素直接插入到哈希表中,并直接将其对应的value值赋为1
最后再循环判断并返回哈希表中value值等于1(即第一次出现一次的元素)的下标
下面为该方法中使用的重要方法:
//根据Key值判断哈希表中是否包含某元素的方法
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
//根据Key值来获取对应的value值的方法
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
下面为实现完整代码
package FirstNotRepeatingChar;
import java.util.HashMap;
/**
* @author LXY
* @email 403824215@qq.com
* @date 2018/7/25 16:13
*
* 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,
* 并返回它的位置,
* 如果没有则返回 -1(需要区分大小写).
* 使用HashMap
*/
public class Solution {
public int FirstNotRepeatingChar(String str) {
HashMap<Character,Integer> map = new HashMap<>();
if(str == null)
{
return -1;
}
for(int i = 0;i < str.length();i++)
{
if(map.containsKey(str.charAt(i)))
{
//包含重复元素
int value = map.get(str.charAt(i));//该方法是得到元素对应映射的值
map.put(str.charAt(i),value + 1);
}
else
{
map.put(str.charAt(i),1);
}
}
for(int i = 0;i < str.length();i++)
{
if(map.get(str.charAt(i)) == 1)
{
return i;
}
}
return -1;
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.FirstNotRepeatingChar("google"));
}
}
方法三:
使用数组来装载每个元素出现的次数
创建一个数组count[]来存放元素出现的次数,特别的是下标传入的是每个元素的ASCII值,这样就能保证相同的元素出现的次数会进行累加
下面为该方法完整实现代码:
package FirstNotRepeatingChar;
/**
* @author LXY
* @email 403824215@qq.com
* @date 2018/7/27 18:39
* 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,
* 并返回它的位置,
* 如果没有则返回 -1(需要区分大小写).
* 使用数组来保存
*/
public class SolutionByArray {
public int FirstNotRepeatingChar(String str) {
char[] charStr = str.toCharArray();
int[] count = new int[256];//256表示ASCII值
for(int i = 0;i < charStr.length;i++)
{
//charStr[i]表示循环遍历每个元素,
//count[charStr[i]]表示对应出每个元素的ASCII值为count数组的下标