* 面试题50:第一次只出现一次的字符
* 题目一:字符串中第一次只出现一次的字符
* 在字符串中找出第一个只出现一次的字符。
* 如输入"abaccdeff",则输出'b'
*
* 思路:统计每个字符串显得次数:需要使用一个容器存储 ---哈希表 键:ASCII码 值:字符串中出现的次数
* 需要进行两次扫描:
* 第一次扫描:跟新哈希表中灭一个字符出现的次数
* 第二次扫描:没扫描一个字符,就从哈希表中读取其出现的次数,遇到的第一个仅出现一次的字符,则将其返回即可
* 因为字符是一个长度为8的数据类型,因此总共有256种可能。所以只需要创建一个256,以字符ASCII码为键的哈希表即可
package Test;
public class No50GetFirstNotRepeatingChar_InString {
/*
* 面试题50:第一次只出现一次的字符
* 题目一:字符串中第一次只出现一次的字符
* 在字符串中找出第一个只出现一次的字符。
* 如输入"abaccdeff",则输出'b'
*
* 思路:统计每个字符串显得次数:需要使用一个容器存储 ---哈希表 键:ASCII码 值:字符串中出现的次数
* 需要进行两次扫描:
* 第一次扫描:跟新哈希表中灭一个字符出现的次数
* 第二次扫描:没扫描一个字符,就从哈希表中读取其出现的次数,遇到的第一个仅出现一次的字符,则将其返回即可
* 因为字符是一个长度为8的数据类型,因此总共有256种可能。所以只需要创建一个256,以字符ASCII码为键的哈希表即可
*
*
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
No50GetFirstNotRepeatingChar_InString g = new No50GetFirstNotRepeatingChar_InString();
String s = "abaccdeff";
System.out.println("字符串中第一个只出现一次的字符:"+g.GetFirstNotRepeatingChar_InString(s));
}
private int GetFirstNotRepeatingChar_InString(String s) {
// TODO Auto-generated method stub
if(s == null || s.length() <= 0)
return 0;
int[] ch = new int[256];
for(int i = 0;i < s.length();i++) {
ch[s.charAt(i)]++;
}
for(int i = 0;i < s.length();i++) {
//ch用于记录每一个字符出现的次数
System.out.println(ch[s.charAt(i)]);
}
for(int i = 0;i < s.length();i++) {
if(ch[s.charAt(i)] == 1)
return i;
}
return 0;
}
}
* 面试题50:第一次只出现一次的字符
* 题目二:字符流中第一个只出现一次的字符
* 请事先一个函数,用来找出字符流中第一个只出现一次的字符。
* 例如:当从字符流中独处耆那两个字符“go”时,第一次只出现一次的字符是‘g’;
* 当从该字符流中独处前6个字符“google”时,第一个只出现一次的字符是‘l’
*
* 思路:与上一个思路一致
* 但是使用的容器要有键值配对的存储结构
* 若无出现一次的字符则返回#
package Test;
public class No50GetFirstNotRepeatingChar_InStream {
/*面试题50:第一次只出现一次的字符
* 题目二:字符流中第一个只出现一次的字符
* 请事先一个函数,用来找出字符流中第一个只出现一次的字符。
* 例如:当从字符流中独处耆那两个字符“go”时,第一次只出现一次的字符是‘g’;
* 当从该字符流中独处前6个字符“google”时,第一个只出现一次的字符是‘l’
*
* 思路:与上一个思路一致
* 但是使用的容器要有键值配对的存储结构
* 若无出现一次的字符则返回#
*
*
* */
//特殊哈希结构:键:字符的ASCII码;值:字符出现的次数
static class HashStructure{
int[] chars;
private int index;
//构造函数 将哈希表中的所有值初始化为-1
public HashStructure() {
chars = new int[256];
index = 0;
for(int i = 0;i < chars.length;i++)
chars[i] = -1;
}
//从字符流中插入一个字符
public void Insert(char ch) {
//更新字符流中的数值
//若数值为-1,表示是初始化的值,还未增加 则赋值为index 增加索引的次数index++
//若值大于等于0,则表示已经插入过一次及以上了,这次插入则是第二次+;表明不再是第一次出现了
if(chars[ch] == -1)
chars[ch] = index;
else if(chars[ch] >= 0)
chars[ch] = -2;
index++;
}
//获取字符流中第一个出现一次的字符
public char FirstAppearanceOnce() {
int minIndex = Integer.MAX_VALUE;//设置最小索引
char ch = '#';
for(int i = 0;i < 256;i++) {
//若字符在0~整型的最大值 的范围内 则表示需要将其存入chars[]数组中,
//需要从字符流中的所有字符中找出第一个不重复的字符
//只需要扫描整个数组,并从中找出最小的大于等于0的值对应的字符即可
if(chars[i] < minIndex && chars[i] >= 0 ) {
//实际上只存在==0的 在其中找到索引最小的即可
minIndex = chars[i]; //若新的索引比minIndex还要小 则将其赋值为最小索引
ch = (char) i; //然后在将该索引转为char型
}
//其中;chars[i]是 出现的次数 -1, 0 ,-2 也就是值
// i 是 ASCII码(但是是int型,需要转换为char型) 也就是键
}
return ch;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
HashStructure h = new HashStructure();
h.Insert('a');
h.Insert('o');
h.Insert('g');
h.Insert('o');
h.Insert('a');
System.out.println("字符流中第一个只出现一次的字符是:"+h.FirstAppearanceOnce());
}
}