3.13上周題目總結(jié)

又到了對上周題目總結(jié)的時候了:

第一題:如何去掉一個數(shù)組中重復(fù)的值?

這道題如果只考慮最簡單的情況的話:既整數(shù)數(shù)組的情況

比如輸入: [1,13,24,11,11,14,1,2]

輸出: [1,13,24,11,14,2]

需要去掉重復(fù)的11 和1 這兩個元素

便可以使用object特性進行篩選:

for (let i=0;i < arr.length;i++){

? ? ?if (!hash[arr[i]])? {

? ? ? ? ? ?hash[arr[i]]=true;

? ? ? ? ? data.push(arr[i]);

? ? }

但是很多大神的指出了出題人的不足,如對重復(fù)的定義的問題:數(shù)字1與字符‘1’算不算相等,因此要做到完備,必須考慮很多事情。這里可以看看小蟲大神推薦的文章:淺談JavaScript數(shù)組去重

第二題:找出一個整數(shù)數(shù)組的最大差值,如輸入[10,5,11,7,8,9] 輸出 6

由于上一道題各位大神的指正,這道題直接規(guī)定了整數(shù)數(shù)組,解法也比較容易想到,利用循環(huán)的出數(shù)組的最大值與最小值,然后做差便可以得出答案:

for x in arr {

? ? if (x>=max)

? ? ? ? ?max=x;

? ?if (x<=min)

? ? ? ? ?min=x;

}

當然還有童靴提出可以先排序,但是排序如果不進行預(yù)處理的話,最優(yōu)算法的時間復(fù)雜度是nlogn,這說明對數(shù)組進行排序是沒有必要的,最后再貼出joel大神的代碼,直接利用了Math函數(shù):

let min = Math.min(...arr);

let max = Math.max(...arr);

ret=max - min;

其實前端面試很看重你對函數(shù)的了解情況以及對新知識的運用,比如上周的反轉(zhuǎn)字符串的題目也是這樣。

第三題:求整數(shù)數(shù)組的最大連續(xù)子串,如數(shù)組 [-2, 1, -3, 4, -1, 2, 1, -5, 4]的最大連續(xù)子串是[4, -1, 2, 1]?

如果按照正常的思路,可以使用小蟲大神的方法,先對數(shù)組位置進行標記,然后利用兩個for循環(huán)對每個可能組成的值進行對比:

for(i=0; i < arr.length; i++) {

? ? for(j = i; j < arr.length; j++) {

? ? ? ? ?value = value + arr[j];

? ? ? ? ?if(value > max.value) {

? ? ? ? ? ? ? ? ?max.start = start;

? ? ? ? ? ? ? ? ?max.end = j;

? ? ? ? ? ? ? ? ?max.value = value;

}

有童靴指出可以只對正數(shù)進行操作,這是很正確的想法,再次進行鼓勵。

其實還有O(n)的方法,這是一道很經(jīng)典可以利用動態(tài)規(guī)劃完成的題目:思想即對于每一位數(shù),先取出前一位的信息進行判斷前面連續(xù)子串的總和,如果總和大于等于0,則將自己與前面進行拼接,否則只保留自身,以此生成處理信息傳遞給下一位處理。數(shù)學推導(dǎo)式如下,其中a為原始數(shù)組,b為輔助數(shù)組:

? ? ? ? ? ? ? b(j - 1) + a(j)(當b(j-1) >= 0)

b(j) = {//數(shù)學大括號

? ? ? ? ? ? ? ?a(j) ? ? ? ? ? ? ? ?(當b(j-1) < 0)

既:

for(int i=1;i<=n;i++){

? ? ?if(b>0)

? ? ? ? ? ? ? ? ?b+=a[i];

? ? else ? ?b=a[i];

}

全部代碼可以參照網(wǎng)上一篇:求連續(xù)最大子串

第四題:已知 fn 為一個預(yù)定義函數(shù),實現(xiàn)函數(shù) curryIt,調(diào)用之后滿足如下條件:

1、返回一個函數(shù) a,a 的 length 屬性值為 1(即顯式聲明 a 接收一個參數(shù))

2、調(diào)用 a 之后,返回一個函數(shù) b, b 的 length 屬性值為 1

3、調(diào)用 b 之后,返回一個函數(shù) c, c 的 length 屬性值為 1

4、調(diào)用 c 之后,返回的結(jié)果與調(diào)用 fn 的返回值一致

5、fn 的參數(shù)依次為函數(shù) a, b, c 的調(diào)用參數(shù)

如:var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);

輸出:6

這道題,小蟲大神直接就看出來是考的函數(shù)柯里化

直接上解答:

functioncurryIt(fn) {

? ? ? return ?functiona(xa){

? ? ? ? ? ?return ?functionb(xb){

? ? ? ? ? ? ? ? ? ? return functionc(xc){

? ? ? ? ? ? ? ? ? ? ? ? ? ? return ?fn.call(this,xa,xb,xc);

? ? ? ? ? ? ? ? ? ? ?};

? ? ? ? ? ?};

? ? ?};

}

關(guān)于函數(shù)柯里化,可以看下幺鹿大神的推薦函數(shù)珂里化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容