2014暑期实习的一道面试题
2014-04-12 22:03
239 查看
本人参加了某社交网络公司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写的,请大家批评指正:
一面的时候,面试官出了道编程题,现场作答,题目比较简单,判断两个字符串的字符集合是否相等,相等返回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; } }
相关文章推荐
- 2014腾讯实习一面面试题
- 多益网络2014暑期实习笔试题
- 华为2014上研所暑期实习终面
- 2014腾讯实习一面面试题
- 2014腾讯实习面试题
- 2014腾讯测试实习面试题
- 2014腾讯实习一面面试题
- 金山办公2014暑期实习招聘笔试之旅
- 2014阿里巴巴前端开发工程师暑期实习在线测试题目及答案思路
- 三星南京研发中心2014暑期实习嵌入式开发面试笔试部分
- 2012腾讯暑期实习面试题----寻找链表中间结点
- 2014腾讯实习一面面试题
- 2014腾讯实习一面面试题
- 腾讯2014暑期实习笔试总结
- 2014暑期实习面试
- 2014暑期实习面经(一)
- 腾讯2014暑期实习笔试总结
- 2014南瑞暑期实习面试笔试经历
- 2014腾讯实习一面面试题
- 关于ThreadLocal的一道面试题(酷我公司)