2014暑期实习的一道面试题

本人参加了某社交网络公司2014年暑期实习生招聘,投的岗位是PC客户端开发,笔试和面试问题都是c++和数据结构,计算机网方面的,由于最近一年都是搞的java,c++已经很久没看了,很多问题都答不上来,所以被刷了,回来决定狂补c++的内容,还有多看看书,让自己的基础扎实一点。

一面的时候,面试官出了道编程题,现场作答,题目比较简单,判断两个字符串的字符集合是否相等,相等返回true,不相等返回false,个人的思路是这样的:

由于字符集合只包含a~z和A~Z,所以比较他们的ASCII码就行了,他们的ascii码作为字符集合数组索引,进行比较,因为A~Z是65~90对应的字符数组下表是0~25,a~z是97~122,对应数组下标中的26~51,所以只要维持一个大小为52的boolean型数组作为字符集合就可以了,先将两个数组都转化为byte型数组,然后遍历第一个字符串的byte数组,将出现的单词对应的在其字符集合数组中的位置置true,这样遍历完之后,产生了第一个数组的字符集合boolean型数组,其中置为true的位表示此字符出现过,然后同理遍历第二个数组。将得到的两个字符串的字符集合数组进行对比,至多比较52次,即两个所有字母都出现过。如果;两个字符集合大小不等或者出现一个不相等的字符,直接将待返回的flag变量置为false跳出循环,否则继续判断。

这样的好处是只需要维持一个a~z和A~Z的字符集合数组,将他们的asc号码处理后作为索引,其实就相当于哈希变换,比如第一个个字符串是“abc”,先取得a的asc编码是97,然后减去71就可以得到这个字符在字符集合数组中的位置,然后分别处理两个数组,出现过的字符在字符集合数组中相应的位置为true,然后对比两个字符集合数组,检查相应的位置是否相等,相等表示两个字符串中都出现这个字符,循环遍历就可知道两个集合是否相等,不用一字符循环遍历一次第一个字符串的元素。这样降低了算法的时间复杂度。

可能文字描述不太清晰,下面放上源码,是用java写的,请大家批评指正:

/*	程序来源:腾讯2014暑期实习生面试题
 * 	源文件名称:TecentTest1.java
 *	要  点:
 *		写一个方法判断两个字符串的字符集合是否相等,相等返回true,不相等返回false。
 *		字符包括大小写字母
 *		例如:“AAbc”和“AAbcc”返回true; “AAbc”和“AABC”返回false;
 */

public class TencentTest1{
	public static void main(String[] args){
		System.out.println(testCollection("AAbc","AAbcc"));	
		System.out.println(testCollection("AAbc","AABC"));
		System.out.println(testCollection("aabbc","ab"));
	}
	
	static boolean testCollection(String s1,String s2){
		boolean flag = true;
		byte[] b1 = s1.getBytes();
		byte[] b2 = s2.getBytes();
		boolean[] aCollection = new boolean[52];
		boolean[] bCollection = new boolean[52];
		int aNum = 0;    //a字符串中字符集合大小
		int bNum = 0;
		
		//计算字符串a的字符集合
		for(int i=0;i<b1.length;i++)
			if(b1[i]>=65&&b1[i]<=90){  //大写字母
				if( !aCollection[ b1[i]-65 ]){
					aCollection[ b1[i]-65] = true;
					aNum++;
				}
			}else if(b1[i]>=97&&b1[i]<=122){	 //小写字母
				if( !aCollection[ b1[i]-71 ]){
					aCollection[ b1[i]-71 ] = true;
					aNum++;
				}
			}
			
		//计算字符串b的字符集合	
		for(int i=0;i<b2.length;i++)
			if(b2[i]>=65&&b2[i]<=90){  //大写字母
				if( !bCollection[ b2[i]-65 ]){
					bCollection[ b2[i]-65] = true;
					bNum++;
				}
			}else if(b2[i]>=97&&b2[i]<=122){	 //小写字母
				if( !bCollection[ b2[i]-71 ]){
					bCollection[ b2[i]-71 ] = true;
					bNum++;
				}
			}		
			
		if(aNum == bNum){
			for(int i=0;i<aCollection.length;i++){
				if(aCollection[i]!=bCollection[i]){
					flag = false;
					break;
				}
			}
		}else{
			flag = false;
		}
	
		return flag;
	}
}



点赞