package com.abuge;
/**
* 面试题35:第一个只出现一次的字符
* 题目:在字符串中找出第一个只出现一次的字符,如输入"abaccdeff",则输出'b'
*/
import java.util.HashMap;
public class GetFirstOnceChar
{
public static char getFirstOnce(String str)
{
if(str == null)
return '0';
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
int len = str.length();
//遍历字符串,统计字符串中各个字符出现的次数
for(int i = 0; i < len; i++)
{
String tmpStr = "" + str.charAt(i);
if(hashMap.containsKey(tmpStr))
{
int value = hashMap.get(tmpStr);
value++;
hashMap.remove(tmpStr);
hashMap.put(tmpStr, value);
}else
{
hashMap.put(tmpStr, 1);
}
}
//再次遍历字符串,查找出现次数等于1的字符
for(int i = 0; i < len; i++)
{
String tmpStr = "" + str.charAt(i);
int value = hashMap.get(tmpStr);
if(value == 1)
{
System.out.println(str.charAt(i));
return str.charAt(i);
}
}
return '0';
}
//自定义哈希表
public static char getFirstOnce_2(String str)
{
if(str == null)
{
return '0';
}
//只考虑ASCII码,故有256个字符
int[] hashTable = new int[256];
int len = str.length();
//遍历字符串
for(int i = 0; i < len; i++)
{
char c = str.charAt(i);
hashTable[c]++;
}
//遍历字符串查找第一个出现一次的字符
for(int i = 0; i < len; i++)
{
char c = str.charAt(i);
if(hashTable[c] == 1)
{
System.out.println(c);
return c;
}
}
return '0';
}
public static void main(String[] args)
{
System.out.println("单个字符:");
getFirstOnce("a");
getFirstOnce_2("a");
System.out.println("不存在单个字符:");
getFirstOnce_2("bbccddee");
System.out.println("均是单个字符串:");
getFirstOnce("bacde");
getFirstOnce_2("bacde");
System.out.println("存在出现一次的字符正常字符串:");
getFirstOnce("abaccdeff");
getFirstOnce_2("abaccdeff");
System.out.println("null:");
getFirstOnce(null);
getFirstOnce_2(null);
}
}