几道算法相关面试题

本文提供三道算法面试题的解答。第一题涉及数据库查询优化,第二题讨论URL去重的O(n)时间复杂度解法,第三题是设计一个带有min函数的栈,并给出O(1)时间复杂度的解决方案。

1. 给你10台机器,每个机器2个cpu,2g内存,现在已知在10亿条记录的数据库里执行一次查询需要5秒,问用什么方法能让90%的查询能在100毫秒以内返回结果。
2.一个保存有10000个URL的文本文件,删除其中相同的URL。 

请问这2题怎么做,第二题我只能想出先排序的方法,那么时间复杂度就是O(nlogn)了,有更好的方法么

将每个uml对应到一个整数空间上
对应法则可以是字符的全部编码
也可以是部分,比如开始+中间+结束字符的对应
部分对应不能起到100%的精确判断

编程之美》在CSDN学生大本营上有一个每日更新的主页,每周都有

对一些有趣的算法题的新解和思考,也汇集了不少面试求职过程中提

到算法的故事。
1、第一题含义不明,不知那10亿条记录就只在数据库里,让10个电脑去查询?
  还是10个电脑设计一个替代数据库查询功能的系统,该系统能查询10亿个记录?

2、第二题很简单。
  1)创建一个 set<string> 或者hash_set<string> 的变量,用于记录不重复的URL。
  2)逐行读文本文件,依次得到每个URL;
  3)每读到一个URL,先在set/hash_set 变量中寻找是否有匹配的,如果没有,将URL插入到变量中。
  set 使用的二叉树结构查询,10000个数据中查询的话也不超过14次。hash_set使用散列表的方式,速度更快。
  另:实际上第三步中不用查找,直接向变量中加入记录即可,如果有重复记录的话,会插入失败的。如果查找再插入,反而需要两次搜索过程。

2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。

分析:这是google的一道面试题。
看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素push到辅助栈中;
//或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗。
每次pop一个元素出栈的时候,同时pop辅助栈。
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。
不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;
而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。
当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。
如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,
不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。
来源:足球直播

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值