Intermediate Algorithm Scripting FreeCodeCamp中级算法

Intermediate Algorithm Scripting

1. Sum All Numbers in a Range

function sumAll(arr) {
    var maxVal = Math.max(arr[0], arr[1]);
    var minVal = Math.min(arr[0], arr[1]);

    var arrC = [];
    for (var i = minVal; i <= maxVal; i++) {
    arrC.push(i);
    }
    return arrC.reduce(function (preVal, currentVal) {
    return preVal + currentVal;
    }, 0);
}

2. Diff Two Arrays 取两个数组中不相同的元素

/*
* 比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。
* */

function diff(arr1, arr2) {
    var newArr = [];
    for (var i = 0; i < arr1.length; i++) {
        var isHave = arr2.indexOf(arr1[i]);
        if (isHave < 0) {
            newArr.push(arr1[i]);
        }
    }

    for (var j = 0; j < arr2.length; j++) {
        var isHave2 = arr1.indexOf(arr2[j]);
        if (isHave2 < 0) {
            newArr.push(arr2[j]);
        }
    }
    return newArr;
}

3.Roman Numeral Converter 将给定的数字转换成罗马数字,有局限性

function convert(num) {
    var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
    var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];
    var str = '';
    nums.forEach(function(item,index,array){
        while(num >= item){
            str += romans[index];
            num -= item;
        }
    });
    return str.toUpperCase();
}

4.whrer are you

/*
* 写一个 function,它遍历一个对象数组(第一个参数)
* 并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。
* 如果返回的数组中包含 source 对象的属性-值对,
* 那么此对象的每一个属性-值对都必须存在于 collection 的对象中
* */

function where(collection, source) {
    var arr = [];
    // 属性数组
    var keysArr = Object.keys(source);
    return collection.filter(function (val) {
        // 判断是否包含对应的属性
        return keysArr.every(function (key) {
            return (val.hasOwnProperty(key) && val[key] === source[key]);
        });
    });
}

5. Search and Replace

function myReplace(str, before, after) {
    // 首字母是不是大写
    if (before[0] === before[0].toUpperCase()) {
        after = after[0].toUpperCase() + after.slice(1);
    }
    return str.replace(before, after);
}

6.Pig Latin 把指定的字符串翻译成 pig latin。 知道元音辅音就好算

function translate(str) {
    var myStr = '';
    var regex = /[aeiou]/gi;
    if(str[0].match(regex)){
        myStr = str + 'way';
    } else {
        var index = str.indexOf(str.match(regex)[0]);
        myStr = str.substr(index) + str.substring(0,index) + 'ay';
    }
    return myStr;
}

7. DNA Pairing AT CG,有局限性,不够好

function pair(str) {
    // 分割字符串
    // 每一个进行匹配
    // 组成一个二维数组返回
    var resultArr = [];
    str.split('').map(function (val) {
        var arr = [];
        if (val === "A") {
            arr.push("A");
            arr.push("T");
        }
        if (val === "T") {
            arr.push("T");
            arr.push("A");
        }
        if (val === "C") {
            arr.push("C");
            arr.push("G");
        }
        if (val === "G") {
            arr.push("G");
            arr.push("C");
        }
        resultArr.push(arr);
    });
    return resultArr;
}

8. Missing letters 分割字符串,

// 分割  转码 ,拿到第一个和最后一个, 组成一个数组, 判断原本分割后的缺失的码,
function fearNotLetter(str) {
    // 转码
    var arr = str.split('').map(function (val) {
        return val.charCodeAt(0);
    });
    var wordArr = [];
    // 获得连续字母
    for (var i = str.charCodeAt(0); i < str.charCodeAt(str.length - 1); i++) {
        wordArr.push(i);
    }
    var resultArr = wordArr.filter(function (val) {
       return arr.every(function (tar) {
         return val !== tar;
       });
    });

    if (resultArr.length == 0) {
        return undefined;
    }

    // 转为字母
    return resultArr.map(function (ch) {
       return String.fromCharCode(ch);
    }).join('');
}

9. Boo who 检查一个值是否是基本布尔类型,并返回 true 或 false。

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

10. Sorted Union

// 方法一:
function unite(arr1, arr2, arr3) {
    // 转化为数组
    var args = Array.prototype.slice.call(arguments);
    // reduce 参数数组
    return args.reduce(function (pre, cur) {
        // 遍历下一个数组,如果当前的数组没有该元素,就添加到当前数组中
        for (var i = 0; i < cur.length; i++) {
            if (pre.indexOf(cur[i]) < 0) {
                pre.push(cur[i]);
            }
        }
        return pre;
    });
}

11.Convert HTML Entities 这种写法有局限性

/*
* 将字符串中的字符 &、<、>、” (双引号), 以及 ’ (单引号)转换为它们对应的 HTML 实体。
* */

function convert(str) {
    var arr = ["&", "<", ">",'"', "'"];
    var fuArr = ["&amp;", "&lt;", "&gt;", "&quot;", "&apos;"];
    // 用正则表达式截取字符串中的字符
    var reg = /[&<>"']/g;
    var ssArr = str.match(reg);
    if (ssArr) {
        for (var i = 0; i < ssArr.length; i++) {
            var index = arr.indexOf(ssArr[i]);
            str = str.replace(ssArr[i], fuArr[index]);
        }
    }
    return str;
}

12. Spinal Tap Case

function spinalCase(str) {
    // 1. 正则表达式提取纯文本
    str = str.replace('-', ' ');
    str = str.replace(/[\W\^_]/g, ' ');
    var arr = str.split('');

    // 2. 根据大写分割为单词
    var sss = '';
    arr.map(function (val, index, arr) {
        var cindex = val.charCodeAt(0);
        if (cindex < 65 + 26) {
            // 如果是大写,在前面加个空格,用来分割
            sss += " " + val;
        } else {
            sss += val;
        }
    });

    // 3. 通过空格来进行分割
    // 3. 删除两端的空格
    sss = sss.trim();
    var arr2 = sss.split(' ');
    // 4.转为小写
    arr2 = arr2.map(function (val) {
        return val.toLowerCase();
    });

    arr2 = arr2.filter(function(val){
        return val !== "";
    });
    // 4.拼接,返回
    return arr2.join('-');
}

13. Sum All Odd Fibonacci Numbers

/*
* 给一个正整数num,返回小于或等于num的斐波纳契奇数之和。

斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。

例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。
* */

function sumFibs(num) {
    // 小于3 结果是数字本身
    if (num < 3) {
        return num;
    }
    var arr = [1, 1];
    // 一直加,直到接近前后两个数字
    for (var i = 2; i < Number.POSITIVE_INFINITY; i++) {
        arr[i] = arr[i - 2] + arr[i - 1];
        if (arr[i - 1] >= num) {
            break;
        }
    }
    // 取下标,然后截取数组
    var index = (num <=  arr[arr.length - 1] && arr[arr.length - 2] <= num) ? arr.length -1 : arr.length - 2;
    // 过滤偶数
    var resultArr = arr.splice(0, index).filter(function (val) {
        return (val % 2) === 1;
    });
    // 相加
    return resultArr.reduce(function (pre, current) {
        return pre + current;
    });
}

14. Sum All Primes 求小于等于给定数值的质数之和。

/*
* 求小于等于给定数值的质数之和。

只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。

给定的数不一定是质数。
* */

function sumPrimes(num) {
    // 求出范围内的所有质数
    var arr = [];
    if (num < 2) {
        return 0;
    }

    if (num === 2) {
        return 2;
    }

    for (var i = 2; i <= num; i++) {
        if (i === 2) {
            arr.push(2);
        } else {
            var isHave = false;
            for (var j = 2; j < i; j++){
                // 如果能被整除,那就不是质数了
                if ( i % j === 0) {
                    isHave = true;
                    break;
                }
            }
            if (!isHave) {
                arr.push(i);
            }
        }
    }
    // 求所有质数的和  reduce
    return arr.reduce(function (pre, cur) {
        return pre + cur;
    });
}

15. Smallest Common Multiple 找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。 拿出所有奇数中的质数

function smallestCommons(arr) {
    arr=arr.sort(function(a,b){
        return a - b;
    });
    var num=arr[0];
    for(var i= arr[0]+1;i<=arr[1];i++){
        num*=i/gcd(num,i);
    }
    return num;
    }
    function gcd(m,n){
        if(m%n===0)return n;   return gcd(n,m%n);
}

16. Finders Keepers

function find(arr, func) {
    for(var i = 0; i < arr.length; i++){
        var result = func(arr[i]);
        if (result === true) {
            return arr[i];
        }
    }
}

17 . Drop it

function drop(arr, func) {
    var resultArr = arr.filter(function(val){
        var result = func(val);
        if (result) {
            return val;
        }
    });
    // 拿到第一个元素
    if(resultArr.length <= 0){
        return [];
    }
    var index =  arr.indexOf(resultArr[0]);
    return  arr.splice(index);
}

18.Steamroller

function steamroller(arr) {
    var resultArr = [];
    arr.map(function(val){
        return my(val);
    });

    return resultArr;
    function my(a) {
        if(Array.isArray(a)) {
            return a.map(function(b){
                return my(b);
            });
        }
        resultArr.push(a);
    }
}

19. Binary Agents

/*
* 传入二进制字符串,翻译成英语句子并返回。

二进制字符串是以空格分隔的。
* */

function binaryAgent(str) {
    // 1. 分割二进制字符串
    var arr = str.split(' ');
    // 2.转化为10进制
    var numArr = arr.map(function (val) {
        return parseInt(val , 2);
    });
    // 转化为 ASII码  把ASII码转为字符串连接起来
    return numArr.map(function (tar) {
        return String.fromCharCode(tar);
    }).join('');
}

20. Everything Be True

function every(collection, pre) {
    return collection.every(isHaveProperty);

    function isHaveProperty (element, index, arr) {
        return element.hasOwnProperty(pre) && element[pre] !== undefined && Boolean(element[pre]);
    }
}

21.Arguments Optional

/*
* 创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。
* */

function add() {
    if(typeof arguments[0] !== "number" || (arguments.length > 1 && typeof arguments[1] !== "number")){
        return undefined;
    }
    if(arguments.length == 1){
        var arg0 = arguments[0];
        return function(num){
            if(typeof num !== "number"){
                return undefined;
            }
            return arg0 + num;
        };
    }else{
        return arguments[0] + arguments[1];
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值