【算法】一道腾讯前端试题,位图法(bitmap),感受一下什么叫做“算法”

  学了这么久编程了,for循环使用了不知道多少次。解决一个计算问题,可以用n种不同的方法来实现,而优秀的算法,可以提高计算效率,这对于大量的计算有着显著的作用。

我们学习的编程基础中,并没有强调算法的重要性,因为我们所涉及的计算量对于计算机来说太渺小了,但是,早些将“算法最优性”的意识植入大脑,这将有利于我们向更高级的程序员迈进。这里分享一个腾讯的面试题,不难,但是可以体会到算法的巧妙之处。(先自己想出一个思路,再看答案)

  题目:有一组数字,从1到n(此例子假设n=10),乱序且不存在重复的数字。例如:[8,9,2,3,6,1,4,5,7,10]。从中任意删除了3个数,顺序也再次被打乱,将这些剩余数字放在一个n-3的数组里,请找出丢失的数字,要求算法比较快。

var  n = 10;
var oldArr = [5,1,6,3,7,8,10];//剩余的数组;
var newArr = Array(11); //因为题目中是从1开始的,所以第0位其实没用
var lostArr = [];//要找的数的数组
for(var i = 0; i < n-3; i++) {
    newArr[oldArr[i]] = 1;
}
for(var j = 0; j < newArr.length; j++) {
    if(!newArr[j]) { // !newArr[j]就是当newArr[j]是undefined的时候
lostArr.push(j); } } lostArr.shift(
0); alert(lostArr);

原理就是,创建一个newArray,长度为11。(由于新数组没有定义具体的元素,所以所有元素默认为undefined)。把删除后的数组oldArray里的元素,按照他的值来设置newArray的相应位置。
比如说,old里的第一个元素是5,那么就把newArr[5]的位置设置为1,old的元素值现在也当做new的数组下标,当old元素存在,那么new的相应位置的元素就是1,old中不存在的,new中相应是
undefined(就是101010101010的是非模式)。所以,遍历new,哪个下标的元素是undefined,就证明old的中不存在哪个数值,也就是那些被删除的。
posted @ 2012-07-01 17:51  丛子  阅读(3841)  评论(0编辑  收藏  举报