W3Cschool——中級腳本算法題

JS-train

前言

W3Cschool上有個(gè)編程挑戰(zhàn)墓怀,里面的題目前是面向前端方面的卫键,也有一些算法和數(shù)據(jù)結(jié)構(gòu)的題在莉炉,最近忙于實(shí)習(xí),已經(jīng)很久沒做了絮宁,前后隔了一個(gè)月,在公司沒事的時(shí)候又重新做了起來绍昂,索性花了2天把剩下的一起做完了。在此做下代碼思路的記錄唠椭。

區(qū)間求值算法挑戰(zhàn)

我們會(huì)傳遞給你一個(gè)包含兩個(gè)數(shù)字的數(shù)組忍饰。返回這兩個(gè)數(shù)字和它們之間所有數(shù)字的和。

最小的數(shù)字并非總在最前面撩荣。

function sumAll(arr) {
            return (arr[0] + arr[1]) * (Math.abs(arr[0] - arr[1]) + 1) / 2;
        }
        console.log(sumAll([1, 4]));

找出數(shù)組間差異算法挑戰(zhàn)

比較兩個(gè)數(shù)組饶深,然后返回一個(gè)新數(shù)組,該數(shù)組的元素為兩個(gè)給定數(shù)組中所有獨(dú)有的數(shù)組元素台猴。換言之俱两,返回兩個(gè)數(shù)組的差異。

//map或forEach數(shù)組方法
        var diff = function(arr1, arr2) {
            var diff = [];
            arr1.map(function(val1) {
                if (arr2.indexOf(val1) < 0) {
                    diff.push(val1);
                } else {
                    arr2.splice(arr2.indexOf(val1), 1);
                }
            });
            return diff.concat(arr2);
        };
        //傳統(tǒng)for循環(huán)
        // var diff = function(arr1, arr2) {
        //     var diff = [];
        //     for (var i = 0; i < arr1.length; i++) {
        //         if (arr2.indexOf(arr1[i]) < 0) {
        //             diff.push(arr1[i]);
        //         } else {
        //             arr2.splice(arr2.indexOf(arr1[i]), 1);
        //         }
        //     }
        //     return diff.concat(arr2);
        // };
        console.log(diff([1, 2, 3, 6, 5], [1, 2, 3, 4, 5]));

數(shù)字轉(zhuǎn)羅馬數(shù)字

將給定的數(shù)字轉(zhuǎn)換成羅馬數(shù)字休讳。

所有返回的 羅馬數(shù)字 都應(yīng)該是大寫形式尿孔。

代碼的關(guān)鍵在于lookup對象里面的鍵值對筹麸,都是1,4,5,9這幾個(gè)數(shù)字進(jìn)位雏婶。 看圖更容易明白。


數(shù)字轉(zhuǎn)羅馬數(shù)字
function convert(num) {
  var lookup ={M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
  var romanStr = "";
  for (var i in lookup){
    while (num >= lookup[i]){
      romanStr+=i;
      num -= lookup[i];
    }
  }
  return romanStr;
}

convert(36);

對象搜索算法挑戰(zhàn)

寫一個(gè) function,它遍歷一個(gè)對象數(shù)組(第一個(gè)參數(shù))并返回一個(gè)包含相匹配的屬性-值對(第二個(gè)參數(shù))的所有對象的數(shù)組错维。如果返回的數(shù)組中包含 source 對象的屬性-值對,那么此對象的每一個(gè)屬性-值對都必須存在于 collection 的對象中鹉动。

例如宏邮,如果第一個(gè)參數(shù)是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二個(gè)參數(shù)是 { last: "Capulet" }械筛,那么你必須從數(shù)組(第一個(gè)參數(shù))返回其中的第三個(gè)對象飒炎,因?yàn)樗俗鳛榈诙€(gè)參數(shù)傳遞的屬性-值對。

function where(collection, source) {
            var arr = [],
                index = 0; // What's in a name? 
            // console.log(Object.getOwnPropertyNames(source).length); //獲取對象屬性個(gè)數(shù)
            for (; index < collection.length; index++) {
                for (var key in collection[index]) {
                    var count = 0;
                    for (var key2 in source) {
                        if (collection[index].hasOwnProperty(key2)) {
                            if (source[key2] == collection[index][key2]) {
                                count++;
                            }
                            if (count == Object.getOwnPropertyNames(source).length && key == key2) {
                                arr.push(collection[index]);
                            }
                        }
                    }
                }

            }
            return arr;
        }

查詢替換算法挑戰(zhàn)

使用給定的參數(shù)對句子執(zhí)行一次查找和替換赤赊,然后返回新句子煞赢。

第一個(gè)參數(shù)是將要對其執(zhí)行查找和替換的句子。

第二個(gè)參數(shù)是將被替換掉的單詞(替換前的單詞)吹截。

第三個(gè)參數(shù)用于替換第二個(gè)參數(shù)(替換后的單詞)凝危。

注意:替換時(shí)保持原單詞的大小寫。例如懦铺,如果你想用單詞 "dog" 替換單詞 "Book" 趴生,你應(yīng)該替換成 "Dog"昏翰。

function myReplace(str, before, after) {
            var newBefore = before.split(""),
                newAfter = after.split(""),
                upindex = [],
                i = 0,
                index = 0;
            for (; i < newBefore.length; i++) {
                if (newBefore[i] > 'A' && newBefore[i] < 'Z') {
                    upindex.push(i);
                }
            }
            for (; index < upindex.length; index++) {
                if (newAfter[upindex[index]]) {
                    newAfter[upindex[index]] = newAfter[upindex[index]].toString().toUpperCase();
                }
            }
            return str.replace(before, newAfter.join(""));
        }

字符串移動(dòng)插入算法挑戰(zhàn)

把指定的字符串翻譯成 pig latin。

Pig Latin 把一個(gè)英文單詞的第一個(gè)輔音或輔音叢(consonant cluster)移到詞尾柳洋,然后加上后綴 "ay"。

如果單詞以元音開始据块,你只需要在詞尾添加 "way" 就可以了折剃。

function translate(str) {
            var a = str.search(/[aeiou]/);
            var str2 = str;
            if (a === 0) {
                str2 += "way";
            } else {
                str2 = str.substr(a);
                str2 += str.substr(0, a);
                str2 += "ay";
            }
            return str2;
        }
       

translate("consonant");

字符配對算法挑戰(zhàn)

DNA 鏈缺少配對的堿基。依據(jù)每一個(gè)堿基边篮,為其找到配對的堿基奏甫,然后將結(jié)果作為第二個(gè)數(shù)組返回。

Base pairs(堿基對) 是一對 AT 和 CG思杯,為給定的字母匹配缺失的堿基挠进。

在每一個(gè)數(shù)組中將給定的字母作為第一個(gè)堿基返回。

例如暖璧,對于輸入的 GCG攘须,相應(yīng)地返回 [["G", "C"], ["C","G"],["G", "C"]]

字母和與之配對的字母在一個(gè)數(shù)組內(nèi),然后所有數(shù)組再被組織起來封裝進(jìn)一個(gè)數(shù)組于宙。

function pair(str) {
            var arr = new Array();
            str = str.split("");
            for (var index = 0; index < str.length; index++) {
                arr[index] = new Array();
                arr[index].push(str[index]);
                if (str[index] == "G" || str[index] == "C") {
                    (arr[index] == "G") ? arr[index].push(
                        "C"): arr[index].push("G");
                } else {
                    (arr[index] == "A") ? arr[index].push("T"): arr[index].push("A");
                }
            }
            return arr;
        }

字符串查詢補(bǔ)充算法挑戰(zhàn)

從傳遞進(jìn)來的字母序列中找到缺失的字母并返回它捞魁。

如果所有字母都在序列中,返回 undefined奉件。

function fearNotLetter(str) {
            var sub;
            for (var index = 0; index < str.length - 1; index++) {
                sub = str.charCodeAt(index + 1) - str.charCodeAt(index);
                if (sub == 1) {
                    if (index == str.length) {
                        return undefined;
                    }
                } else {
                    return String.fromCharCode(str.charCodeAt(index) + 1);
                }
            }
        }

輸入檢查算法挑戰(zhàn)

檢查一個(gè)值是否是基本布爾類型,并返回 true 或 false术陶。

基本布爾類型即 true 和 false煤痕。

function boo(bool) {
  if (bool === true || bool ===false){
      return true;
      }
  return false;
}

數(shù)組去重算法挑戰(zhàn)

寫一個(gè) function,傳入兩個(gè)或兩個(gè)以上的數(shù)組摆碉,返回一個(gè)以給定的原始數(shù)組排序的不包含重復(fù)值的新數(shù)組巷帝。

換句話說,所有數(shù)組中的所有值都應(yīng)該以原始順序被包含在內(nèi)楞泼,但是在最終的數(shù)組中不包含重復(fù)值。

非重復(fù)的數(shù)字應(yīng)該以它們原始的順序排序辣垒,但最終的數(shù)組不應(yīng)該以數(shù)字順序排序印蔬。

function unite(arr1, arr2, arr3, arr4) {
            var arr = [],
                result = [],
                index = 0;
            if (arr4) {
                arr = arr1.concat(arr2, arr3, arr4);
            } else if (arr3) {
                arr = arr1.concat(arr2, arr3);
            } else {
                arr = arr1.concat(arr2);
            }
            for (; index < arr.length; index++) {
                if (result.indexOf(arr[index]) == -1) {
                    result.push(arr[index]);
                }
            }
            return result;
        }

es6實(shí)現(xiàn)

//ES6新增的Set數(shù)據(jù)結(jié)構(gòu)侥猬,類似于數(shù)組,但是里面的元素都是唯一的 退唠,其構(gòu)造函數(shù)可以接受一個(gè)數(shù)組作為參數(shù)
//let arr=[1,2,1,2,6,3,5,69,66,7,2,1,4,3,6,8,9663,8]
//let set = new Set(array);
//{1,2,6,3,5,69,66,7,4,8,9663}
//ES6中Array新增了一個(gè)靜態(tài)方法from,可以把類似數(shù)組的對象轉(zhuǎn)換為數(shù)組
//Array.from(set)
//[1,2,6,3,5,69,66,7,4,8,9663]
function removeRepeatArray(arr){
    return Array.from(new Set(arr))
}

html符號轉(zhuǎn)實(shí)體算法挑戰(zhàn)

將字符串中的字符 &屎债、<垢油、>、" (雙引號), 以及 ' (單引號)轉(zhuǎn)換為它們對應(yīng)的 HTML 實(shí)體躯喇。

function convert(str) {
  return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');
}
convert("Dolce & Gabbana");

數(shù)組平鋪算法挑戰(zhàn)

對嵌套的數(shù)組進(jìn)行平鋪嵌套數(shù)組硝枉。你必須考慮到不同層級的嵌套倦微。

function steamroller(arr) {
  // I'm a steamroller, baby
  return arr.reduce(function (acc, val) {
    return acc.concat(Array.isArray(val) ? (val.length > 0 ? steamroller(val) : []) : val);
  }, []);
}

steamroller([1, [2], [3, [[4]]]]);

二進(jìn)制轉(zhuǎn)字符算法挑戰(zhàn)

傳入二進(jìn)制字符串欣福,翻譯成英語句子并返回蔑匣。

二進(jìn)制字符串是以空格分隔的棕诵。

function binaryAgent(str) {
            var arg = str.split(" ");
            var temp, i;
            var newArg = new Array();
            for (i = 0; i < arg.length; i++) {
                temp = String.fromCharCode(parseInt(arg[i], 2));
                newArg.push(temp);
            }
            return newArg.join("");
        }
        console.log(binaryAgent(
            "01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"
        ));

數(shù)組元素判斷算法挑戰(zhàn)

完善編輯器中的every函數(shù),如果集合(collection)中的所有對象都存在對應(yīng)的屬性(第二個(gè)參數(shù))价脾,并且屬性(第二個(gè)參數(shù))對應(yīng)的值為真笛匙。函數(shù)返回ture。反之秋柄,返回false蠢正。

記住:您可以通過點(diǎn)符號或[]符號來訪問對象屬性嚣崭。

function every(collection, pre) {
            // Is everyone being true?
            function check(element, index, array) {
                return element[pre];
            }
            if (collection.every(check)) {
                return true;
            } else return false;
        }

函數(shù)迭代可選參數(shù)算法挑戰(zhàn)

創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function雹舀。如果只有一個(gè)參數(shù),則返回一個(gè) function说榆,該 function 請求一個(gè)參數(shù)然后返回求和的結(jié)果。

例如串慰,add(2, 3) 應(yīng)該返回 5荠卷,而 add(2) 應(yīng)該返回一個(gè) function。

調(diào)用這個(gè)有一個(gè)參數(shù)的返回的 function掂碱,返回求和的結(jié)果:

var sumTwoAnd = add(2);

sumTwoAnd(3) 返回 5。

如果兩個(gè)參數(shù)都不是有效的數(shù)字疼燥,則返回 undefined醉者。

<!-- 應(yīng)付答案解法 -->
var add = function(x, r) {
            if (arguments.length == 1 && !isNaN(x)) {
                return function(y) {
                    if (y instanceof Array) {
                        return undefined;
                    } else return x + y;
                };
            } else if (typeof(r) == "string" || isNaN(x)) {
                return undefined;
            } else return x + r;
        };

<!-- 其他標(biāo)準(zhǔn)解法 -->
function add() {
  var arr=[].concat(...arguments);
  if( arr.some(function(ele){
    return typeof ele!="number";
  }) ){    //參數(shù)出現(xiàn)非數(shù)字類型,返回undefined
    return undefined;
  }
  if( arr.length==2 ){
    return arr[0]+arr[1];
  }
  return function(a){
    if( typeof a != "number" ){  //同上
      return undefined;
    }
    return a+arr[0];
  };
}

注: isNaN()的參數(shù)如果不是數(shù)值型的會(huì)先自動(dòng)轉(zhuǎn)換成數(shù)值型立磁,再來判斷這個(gè)數(shù)值是不是NaN

MDN文檔節(jié)選關(guān)于isNaN
// The same effect with Number.isNaN():
        function increment(x) {
            if (Number.isNaN(Number(x))) x = 0;
            return x + 1;
        };

        // In the following cases for the function's argument x,
        // isNaN(x) is always false, although x is indeed not a
        // number, but can be used as such in arithmetical
        // expressions
        increment(""); // 1: "" is converted to 0
        increment(new String()); // 1: String object representing an empty string is converted to 0
        increment([]); // 1: [] is converted to 0
        increment(new Array()); // 1: Array object representing an empty array is converted to 0
        increment("0"); // 1: "0" is converted to 0
        increment("1"); // 2: "1" is converted to 1
        increment("0.1"); // 1.1: "0.1" is converted to 0.1
        increment("Infinity"); // Infinity: "Infinity" is converted to Infinity
        increment(null); // 1: null is converted to 0
        increment(false); // 1: false is converted to 0
        increment(true); // 2: true is converted to 1
        increment(new Date()); // returns current date/time in milliseconds plus 1

End

文中省略了一些題目的答案唱歧,因?yàn)槠A(chǔ)和比較簡單粒竖,我就略過了。如果大家有es6標(biāo)準(zhǔn)下或其他的一些解法思路蕊苗,也可以跟我討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尖滚,一起剝皮案震驚了整個(gè)濱河市锅移,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌置逻,老刑警劉巖备绽,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肺素,死亡現(xiàn)場離奇詭異,居然都是意外死亡倍靡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門他挎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筹淫,你說我怎么就攤上這事呢撞。” “怎么了殊霞?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵脓鹃,是天一觀的道長。 經(jīng)常有香客問我,道長岩齿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任龄章,我火速辦了婚禮乞封,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锚贱。我一直安慰自己关串,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布吧碾。 她就那樣靜靜地躺著墓卦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睁本。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天屁倔,我揣著相機(jī)與錄音暮胧,去河邊找鬼。 笑死往衷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的布轿。 我是一名探鬼主播来颤,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萝毛!你這毒婦竟也來了滑黔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤庵佣,失蹤者是張志新(化名)和其女友劉穎汛兜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體验毡,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帝嗡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年哟玷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了一也。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喉脖。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖树叽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁仗,我是刑警寧澤性锭,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站她奥,受9級特大地震影響怎棱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹄殃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一诅岩、第九天 我趴在偏房一處隱蔽的房頂上張望带膜。 院中可真熱鬧,春花似錦膝藕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠕趁。三九已至,卻和暖如春辛馆,著一層夾襖步出監(jiān)牢的瞬間俺陋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腊状,地道東北人诱咏。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缴挖,于是被迫代替她去往敵國和親袋狞。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容