本人参加了某社交网络公司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;
}
}