《剑指offer—面试题50:第一个只出现一次的字符》
注明:仅个人学习笔记
import java.util.HashMap;
import java.util.Map;
/**
*
*
* 第一个只出现一次的字符
*
* 在字符串中,找出第一个只出现一次的字符 如输入“abaccdeff” 输出‘b’
*
* FirstNotRepeatingChar输出第一个只出现一次的字符
* FirstNotRepeatingCharIndex输出第一个只出现一次的字符的位置
*
*/
public class FirstNotRepeatingChar50
{
// 输出第一个只出现一次的字符
public Character FirstNotRepeatingChar(String str)
{
if (str == null || str.length() == 0)
{
return 0;
}
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < str.length(); i++)
{
char curChar = str.charAt(i);
if (map.containsKey(curChar))
{
int time = map.get(str.charAt(i));
map.put(curChar, ++time);
} else
{
map.put(curChar, 1);
}
}
// Character ch1 = null;
//
// for (Character key : map.keySet())
// {
// if (map.get(key) == 1)
// {
// ch1 = key;
// break;
// }
//
// }
// 因为hashmap的Key值会自动字典排序,比如google,e作为key就会排到l前面,但实际上第一次出现一次的字符应该是l,直接去遍历map找value=1的Key会输出e
// 所以应该顺序遍历字符串,然后找每次遍历的字符的key,找到第一个value等于1的,即为所求
for (int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if (map.get(c) == 1)
{
return c;
}
}
return null;
}
// 输出第一个只出现一次的字符的所在位置
public int FirstNotRepeatingCharIndex(String str)
{
if (str == null || str.length() < 0 || str.length() > 10000)
{
return -1;
}
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < str.length(); i++)
{
char curChar = str.charAt(i);
// 判断当前字符是一个英文字母,是的话才进行遍历和后续添加
if ((curChar >= 'A' && curChar <= 'Z') || (curChar >= 'a' && curChar <= 'z'))
{
if (map.containsKey(curChar))
{
int time = map.get(str.charAt(i));
map.put(curChar, ++time);
} else
{
map.put(curChar, 1);
}
} else
{
map.clear();
System.out.println(str + " :字符串中包含非字母字符");
return -1;
}
}
int pos = -1;
int i = 0;
for (; i < str.length(); i++)
{
char c = str.charAt(i);
if (map.get(c) == 1)
{
return i;
}
}
return pos;
}
public static void main(String[] args)
{
FirstNotRepeatingChar50 f = new FirstNotRepeatingChar50();
// String str = "aAacdeff";
//String str = "Z*google";
String str = "NXWtnzyoHoBhUJaPauJaAitLWNMlkKwDYbbigdMMaYfkVPhGZcrEwp";
Character ch = f.FirstNotRepeatingChar(str);
System.out.println(ch);
int index = f.FirstNotRepeatingCharIndex(str);
System.out.println(index);
// int index = f.FirstNotRepeatingChar1(str);
// System.out.println("字符" + ch + "是字符串" + str + "中第一个只出现一次的字符,且出现位置是:" +
// index);
}
}