《面试题甄选》13.第一个只出现一次的字符

《面试题精选》13.第一个只出现一次的字符

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b


分析:首先拿到一到数据结构算法题,你会先想到什么?必然是我们要利用到什么数据结构来解决这道问题。首先想到的肯定是链表,栈,队列,可以吗?想了很久感觉不行,然后我又想到用各种树,感觉时间复杂度还是不好。最后,好吧,不会做。怎么办,看答案呗。然后发现,我ri,hash表,竟然忘了这东西。

为什么会想到用hash表呢?首先我们知道最最好的时间复杂度不会超过O(n),也就是说不管你怎样,你都必须遍历一次字符串。好吧,于是我们就会想如何让其遍历一次就能知道谁是第一个只出现过一次的字符呢?方法是,你第一次遍历的过程中记录下他的出现过的次数不就行了。好,ok方法出来了,那么利用什么数据结构来存储,这两个数据(一个单个字符,一个该字符出现次数)呢。很容易就想到用hash表了。见:Hash Tables(哈希表)

什么是hash表?

哈希表hashtable(key,value) 的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。


下面我们就利用key来代表单个字符,value来代表该字符出现的次数。首先根据定义,就是将key变为整型数字。char字符是长度为8的数据类型,所以有2^8=256种可能。我们定义一个数组hashArray[256].然后首先初始化这个数组中的元素都为0.遍历字符串,记录字符出现的次数。最后再从hashArray中找到第一个为零的字符。

public class NoRepeat{
	public static void main(String args[]){
		int[] hashArray = new int[256];
		String str = "abaccdeff" ;
		for(int i=0;i<256;i++){
			hashArray[i] = 0 ;
		}
		char[] ch = str.toCharArray() ;
		for(int i=0;i<ch.length;i++){
			hashArray[ch[i]]++ ;
		}
		for(int i=0;i<ch.length;i++){
			if(hashArray[ch[i]]==1){
				System.out.println("the first is " + ch[i]) ;
				i = ch.length ;
			}
		}
	}
}

总结:此图考察的是对hash表定义的理解程度。详见:Hash Tables(哈希表)