今天参加面试(公司保密吧~),主要是算法,下面整理一下。
题目1:字符串str2中的字符是否在字符串str1中都存在?(开始问的是str1是否包含str2子串,我回答用KMP算法)
思路一:toCharArray之后,依次找,复杂度O(nm),面试官当然不满意,我貌似也知道这个算法不会被满意,但是还是第一时间说出来了。
思路二:面试官提醒我说字符串中的字符都是有ASIC码的,是一定范围内的。我恍然大悟,可以设置一个数组存储,数组大小为字符的ASIC码范围。
将str1的字符依次放入数组,(对一定范围内的大数据排序就是这么做的,即Hash算法)。因为这里只是查找,我们只需要在数组中存储1和0,分别表示str1含有这个字符,或不包含这个字符即可。这样完成str1的扫描需要O(n)。
str2中的每个元素只需要O(1)的时间复杂度就可以查看到str1中是否包含它,因为用了Hash。
这样算法的时间复杂度为O(n+m),但是需要辅助空间。
题目2:大数据排序
之前问的是大数据找到最小的10个数,这个就是维持一个最小堆就可以。
后来问的大数据排序,我的回答是类似于归并排序的那种,可又不是归并,因为归并用的辅助空间比较大,大数据内存装不下。
利用“分而治之”的思想,只能是一部分一部分的排,之后将每一部分保存起来,再相互比较着排,这样显然效率很低,但我实在没想出其他办法来。==!
题目3:这个是笔试,两个字符串之间的差距,比如abc和abd差1,art和arw差3。这道题目不是很理解题意,给的例子为什么都是只有一个字母不一样的情况。