Freecodecamp 刷題記錄——前端中級(jí)算法

Sum All Numbers in a RangeComplete

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

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

function sumAll(arr) {
  var start = arr[0];
  var end = arr[1];                  
  if (start > end){
    var temp = start;
    start = end;
    end = temp;
  }
  
  var sum = 0;
  for (var i=start; i<=end; i++){
    sum += i;
  }
  return sum;
}

sumAll([1, 4]);

Diff Two ArraysComplete

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

function diff(arr1, arr2) {
var newArr = arr1.filter(function(data){
    if (arr2.indexOf(data) >= 0) return false;
    else return true;
  });
  newArr = newArr.concat(arr2.filter(function(data){
    if (arr1.indexOf(data) >= 0) return false;
    else return true;
  }));
  // Same, same; but different.
  return newArr;
}

diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);

Roman Numeral Converter

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

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

function convert(num) {
    var retStr = "";

    if (num >= 4000){
        console.log("input out of range");
        return retStr;
    }

    var ROME = [['I', 'V', 'X'], ['X', 'L', 'C'], ['C', 'D', 'M'],['M', ' ', ' ']];

    var count = 0;
    var i = 0;

    while (num > 0){
        var str = "";
        var d = num % 10;
        if (d>0 && d<4){
            for (i=0; i<d; i++){
                str += ROME[count][0];
            }
        }
        else if (d === 4){
            str += ROME[count][0];
            str += ROME[count][1];
        }
        else if (d>=5 && d<9){
            str += ROME[count][1];
            for (i=0; i<(d-5); i++){
                str += ROME[count][0];
            }
        }
        else if (d === 9){
            str += ROME[count][0];
            str += ROME[count][2];
        }

        retStr = str + retStr;
        count++;
        num = parseInt(num/10);
    }
    return retStr;
}

convert(36);

Where art thou

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

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

function where(collection, source) {
    var arr = [];
    // What's in a name?
    var keys = Object.keys(source);

    arr = collection.filter(function(obj){
        //sourceProps.forEach(function(prop){
        for (var i=0; i<keys.length; i++){
            if (!obj.hasOwnProperty(keys[i]) || obj[keys[i]] !== source[keys[i]]){
                return false;
            }
        }
        return true;
    });

    return arr;
}

console.log(where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }));

Search and Replace

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

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

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

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

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

如果你被難住了,記得使用 Read-Search-Ask嘗試與他人結(jié)伴編程、編寫你自己的代碼。

這是一些對(duì)你有幫助的資源:

function myReplace(str, before, after) {
    var firstLetter = before.charAt(0);
    if (firstLetter >= 'A' && firstLetter <='Z'){
        after = after[0].toUpperCase() + after.slice(1);
    }

    if (firstLetter >= 'a' && firstLetter <='z'){
        after = after[0].toLowerCase() + after.slice(1);
    }
    return str.replace(before, after);
}

str = myReplace("He is Sleeping on the couch", "Sleeping", "sitting");

console.log(str);

高級(jí)首字符大寫方式:

function firstWordUpperCase(str){
    return str.toLowerCase().replace(/(\s|^)[a-z]/g, function(char){
        return char.toUpperCase();
    });
}

作者:qq_32578487
來(lái)源:CSDN
原文:https://blog.csdn.net/qq_32578487/article/details/77870225
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

Pig Latin

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

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

如果單詞以元音開(kāi)始,你只需要在詞尾添加 "way" 就可以了。

function isVowel(ch){
    var VOWEL = ['a', 'e', 'i' ,'o','u'];
    if (VOWEL.indexOf(ch)>=0){
        return true;
    }
    return false;
}

function translate(str) {
    if (isVowel(str[0])){
        str = str + "way";
    }
    else {
        var i = 1;
        while (!isVowel(str[i])){
            i++;
        }
        str = str.slice(i) + str.slice(0, i) + "ay";
    }
    return str;
}

str = translate("consonant");

DNA Pairing

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

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

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

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

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

function pair(str) {
    var arr = [];
    Array.from(str).forEach(function(ch){
        if (ch==='A'){
            arr.push(['A', 'T']);
        }
        if (ch==='T'){
            arr.push(['T', 'A']);
        }
        if (ch==='C'){
            arr.push(['C', 'G']);
        }
        if (ch==='G'){
            arr.push(['G', 'C']);
        }
    });
    return arr;
}

pair("GCG");

高端寫法:

function pair(str) {
  var obj = {'A':'T','T':'A','G':'C','C':'G'};

  return str.split('').map(e => [e,obj[e]]);
}

pair("GCG");

Missing letters

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

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

如果你被卡住了,記得開(kāi)大招 Read-Search-Ask。嘗試與他人結(jié)伴編程、編寫你自己的代碼。

這是一些對(duì)你有幫助的資源:

function fearNotLetter(str) {
    var norm = str[0].charCodeAt();
    for (var i=1; i<str.length; i++){
        var code = str[i].charCodeAt(); 
        norm++;
        if (code!==norm){
            return String.fromCharCode(norm);
        }
    }
    return undefined;
}

fearNotLetter("abce");

Boo who

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

基本布爾類型即 true 和 false。

function boo(bool) {
    // What is the new fad diet for ghost developers? The Boolean.
    return typeof bool === 'boolean';
}

str = boo(true);

console.log(str);

Sorted Union

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

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

非重復(fù)的數(shù)字應(yīng)該以它們?cè)嫉捻樞蚺判?,但最終的數(shù)組不應(yīng)該以數(shù)字順序排序。

function unite(arr1, arr2, arr3) {
    var args = arguments;
    for (var i=1; i<args.length; i++){
        for (var j=0; j<args[i].length; j++){
           if (arr1.indexOf(args[i][j]) === -1){
                arr1.push(args[i][j]);
           }
        }
    }

    return arr1;
}

unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);

Convert HTML Entities

將字符串中的字符 &、<、>、" (雙引號(hào)), 以及 ' (單引號(hào))轉(zhuǎn)換為它們對(duì)應(yīng)的 HTML 實(shí)體。

function convert(str) {
    // &colon;&rpar;
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '&quot;');
    str = str.replace(/'/g, '&apos;');
    return str;
}

convert("Dolce & Gabbana");

Spinal Tap Case

將字符串轉(zhuǎn)換為 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的,也就是以連字符連接所有小寫單詞。

如果你被卡住了,記得開(kāi)大招 Read-Search-Ask。嘗試與他人結(jié)伴編程、編寫你自己的代碼。

這是一些對(duì)你有幫助的資源:

function spinalCase(str) {
  // "It's such a fine line between stupid, and clever."
  // --David St. Hubbins
  return str.replace(/[\s_]/g, '-')
            .replace(/([a-z])([A-Z])/g, '$1-$2')
            .toLowerCase();
}

str = spinalCase("thisIsSpinalTap");

console.log(str);

使用正則表達(dá)式。
tips1: 思路,先把空格和下劃線換成-;再把相鄰的小寫和大寫字母之間加上-;最后全部轉(zhuǎn)為小寫。
tips2:第二部匹配相鄰的小寫和大寫字母時(shí),不能寫成/[a-z][A-Z]/g,否則:

str = spinalCase("thisIsSpinalTap");
\\輸出 thi$1-$2$1-$2pina$1-$2ap

參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp
(x):匹配 x 并且捕獲匹配項(xiàng)。 這被稱為捕獲括號(hào)(capturing parentheses)。
也就是說(shuō),想用1, ...,9,必須得有()。

Sum All Odd Fibonacci Numbers

給一個(gè)正整數(shù)num,返回小于或等于num的斐波納契奇數(shù)之和。

斐波納契數(shù)列中的前幾個(gè)數(shù)字是 1、1、2、3、5 和 8,隨后的每一個(gè)數(shù)字都是前兩個(gè)數(shù)字之和。

例如,sumFibs(4)應(yīng)該返回 5,因?yàn)殪巢{契數(shù)列中所有小于4的奇數(shù)是 1、1、3。

提示:此題不能用遞歸來(lái)實(shí)現(xiàn)斐波納契數(shù)列。因?yàn)楫?dāng)num較大時(shí),內(nèi)存會(huì)溢出,推薦用數(shù)組來(lái)實(shí)現(xiàn)。

function sumFibs(num) {
    var sum;
    if (num <= 2){
        sum = num;
    }
    else {
        var fibPre = 1;
        var fibNext = 2;
        
        sum = 2;

        while (fibNext <= num){
            if (fibNext%2 !== 0){
                sum += fibNext;
            }
            var temp = fibNext + fibPre;
            fibPre = fibNext;
            fibNext = temp;
            console.log("fib"+fibNext);
        }
    }

    return sum;
}

str = sumFibs(1000);

console.log(str);

Sum All Primes

求小于等于給定數(shù)值的質(zhì)數(shù)之和。

只有 1 和它本身兩個(gè)約數(shù)的數(shù)叫質(zhì)數(shù)。例如,2 是質(zhì)數(shù),因?yàn)樗荒鼙?1 和 2 整除。1 不是質(zhì)數(shù),因?yàn)樗荒鼙蛔陨碚?/p>

給定的數(shù)不一定是質(zhì)數(shù)。

function isPrime(num){
    if (num<=1){
        return false;
    }
    for (var i=2; i<=Math.pow(num, 0.5); i++){
        if (num % i === 0){
            return false;
        }
    }
    return true;
}
function sumPrimes(num) {
    var sum = 0;
    for (var i=2; i<=num; i++) {
        if (isPrime(i)){
            sum += i;
        }
    }
  return sum;
}

str = sumPrimes(10);

console.log(str);

Smallest Common Multiple

找出能被兩個(gè)給定參數(shù)和它們之間的連續(xù)數(shù)字整除的最小公倍數(shù)。

范圍是兩個(gè)數(shù)字構(gòu)成的數(shù)組,兩個(gè)數(shù)字不一定按數(shù)字順序排序。

例如對(duì) 1 和 3 —— 找出能被 1 和 3 和它們之間所有數(shù)字整除的最小公倍數(shù)。

function biggestFactor(a, b){
    while (b%a !== 0){
        var temp = b % a;
        b = a;
        a = temp;
    }
    return a;
}

function smallestCommons(arr) {
    if (arr[0] > arr[1]){
        var temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
    }
    var commons = arr[0]; 
    for(var i=arr[0]+1; i<=arr[1]; i++){
        commons = commons * i / biggestFactor(commons, i);
    }
  return commons;
}

str = smallestCommons([5,1]);

console.log(str);

Finders Keepers

寫一個(gè) function,它遍歷數(shù)組 arr,并返回?cái)?shù)組中第一個(gè)滿足 func 返回值的元素。舉個(gè)例子,如果 arr 為 [1, 2, 3],func 為 function(num) {return num === 2; },那么 find 的返回值應(yīng)為 2。

function find(arr, func) {
    var num = arr.filter(func)[0];
    return num;
}

str = find([1, 2, 3, 4], function(num){ return num % 2 === 0; });

console.log(str);

Drop it

隊(duì)友該賣就賣,千萬(wàn)別舍不得。

當(dāng)你的隊(duì)伍被敵人包圍時(shí),你選擇拯救誰(shuí)、拋棄誰(shuí)非常重要,如果選擇錯(cuò)誤就會(huì)造成團(tuán)滅。

如果是AD或AP,優(yōu)先拯救。

因?yàn)锳D和AP是隊(duì)伍輸出的核心。

其次應(yīng)該拯救打野。

因?yàn)榇蛞八懒藢?duì)面就可以無(wú)所顧慮地打龍。

最后才是輔助或上單。

因?yàn)檩o助和上單都是肉,死了也不會(huì)對(duì)團(tuán)隊(duì)造成毀滅性影響,該賣就賣。

但真實(shí)中的團(tuán)戰(zhàn)遠(yuǎn)比這要復(fù)雜,你的隊(duì)伍很可能會(huì)被敵人分割成2個(gè)或3個(gè)部分。

當(dāng)你救了一個(gè)重要的人時(shí),很可能其他隊(duì)友也會(huì)因此獲救。

舉個(gè)例子:

輔助和AD經(jīng)常是在一起的,打野和中單在一起,上單經(jīng)常一個(gè)人。

你救了AD,輔助也經(jīng)常因此獲救。

讓我們來(lái)丟棄數(shù)組(arr)的元素,從左邊開(kāi)始,直到回調(diào)函數(shù)return true就停止。

第二個(gè)參數(shù),func,是一個(gè)函數(shù)。用來(lái)測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle,就從數(shù)組中拋出該元素(注意:此時(shí)數(shù)組已被改變),繼續(xù)測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle,繼續(xù)拋出,直到返回true。

最后返回?cái)?shù)組的剩余部分,如果沒(méi)有剩余,就返回一個(gè)空數(shù)組。

function drop(arr, func) {
    // Drop them elements.
    var empty = [];
    for (var i=0; i<arr.length; i++){
        if (func(arr[i])){
            return arr.slice(i);
        }
    }
    return empty;
}
str = drop([1, 2, 3, 4], function(n) {return n >= 3;});

console.log(str);

Steamroller

對(duì)嵌套的數(shù)組進(jìn)行扁平化處理。你必須考慮到不同層級(jí)的嵌套。

function steamroller(arr) {
    // I'm a steamroller, baby
    var retArr = [];
    arr.forEach(function(item){
        if (Array.isArray(item)){
            retArr = retArr.concat(steamroller(item));
        }
        else{
            retArr.push(item);
        }
    });
    return retArr;
}

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

console.log(str);

Binary Agents

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

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

如果你被卡住了,記得開(kāi)大招 Read-Search-Ask。嘗試與他人結(jié)伴編程、編寫你自己的代碼。

這是一些對(duì)你有幫助的資源:

function binaryAgent(str) {
    var arr = str.split(' ');
    var retStr = "";
    arr.forEach(function(item){
        retStr += String.fromCharCode(parseInt(item, 2));
    });
  return retStr;
}
str = binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");


console.log(str);
傳入二進(jìn)制字符串,翻譯成英語(yǔ)句子并返回。

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

Everything Be True

所有的東西都是真的!

完善編輯器中的every函數(shù),如果集合(collection)中的所有對(duì)象都存在對(duì)應(yīng)的屬性(pre),并且屬性(pre)對(duì)應(yīng)的值為真。函數(shù)返回ture。反之,返回false。

記?。耗阒荒芡ㄟ^(guò)中括號(hào)來(lái)訪問(wèn)對(duì)象的變量屬性(pre)。

提示:你可以有多種實(shí)現(xiàn)方式,最簡(jiǎn)潔的方式莫過(guò)于Array.prototype.every()。

function every(collection, pre) {
  // Is everyone being true?
  return collection.every(function(obj){
        return obj[pre];
  });
}

str = every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");

console.log(str);

Arguments Optional

創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function。如果只有一個(gè)參數(shù),則返回一個(gè) function,該 function 請(qǐng)求一個(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。

如果你被卡住了,記得開(kāi)大招 Read-Search-Ask。嘗試與他人結(jié)伴編程、編寫你自己的代碼。

這是一些對(duì)你有幫助的資源:

function add() {
    if (arguments.length === 1){
        if (typeof(arguments[0]) !== "number"){
            return undefined;
        }
        else{
            var arg0 = arguments[0];
            return function(num){
                if (typeof(arguments[0]) !== "number"){
                    return undefined;
                }
                else {
                    return num + arg0;
                }
            };
        }
    }
    else if (arguments.length === 2){
        if (typeof(arguments[0]) !== "number" || typeof(arguments[1]) !== "number"){
            return undefined;
        }
        else {
            return arguments[0] + arguments[1];
        }
    }

    return undefined;
}

str = add(3)(4);

console.log(str);

js檢測(cè)數(shù)字:https://blog.csdn.net/sinat_26521835/article/details/79527169

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

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

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