剑指Offer面试题(第三十天)面试题50(String)、50(Stream)

* 面试题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());
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_43137176/article/details/89577742
今日推荐