學了這么久編程了,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的中不存在哪個數值,也就是那些被刪除的。