javascript中级脚本算法
区间求值算法
function sumAll(arr) {
var arrMin = Math.min(arr[0], arr[1]),
arrMax = Math.max(arr[0], arr[1]),
i, sum = 0;
for (i = arrMin; i <= arrMax; i++)
sum += i;
return sum;
}
console.log(sumAll([1, 4])); // 10
console.log(sumAll([4, 1])); // 10
找出数组间差异算法
function diff(arr1, arr2) {
var newArr = [],
newArr1 = [],
newArr2 = [];
newArr1 = arr1.filter(function(value) {
return arr2.indexOf(value) === -1;
});
newArr2 = arr2.filter(function(value) {
return arr1.indexOf(value) === -1;
});
newArr = newArr1.concat(newArr2);
return newArr;
}
console.log(diff(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(diff(["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // [pink wool", "diorite"]
console.log(diff(["andesite", "grass", "dirt", "dead shrub"], ["andesite", "grass", "dirt", "dead shrub"])); // []
console.log(diff([1, 2, 3, 5], [1, 2, 3, 4, 5])); // [4]
console.log(diff([1, "calf", 3, "piglet"], [1, "calf", 3, 4])); // ["piglet", 4]
console.log(diff([], ["snuffleupagus", "cookie monster", "elmo"])); // ["snuffleupagus", "cookie monster", "elmo"]
console.log(diff([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
数字转罗马数字
function convert(num) {
num = (num + '').split('').reverse();
var i,
sum = '',
len = num.length,
romanNumArr = [
['I','II','III','IV','V','VI','VII','VIII','IX'],
['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
['C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
['M', 'MM', 'MMM']
];
for (i = len - 1; i >= 0; i--)
sum += romanNumArr[i][num[i] - 1] ? romanNumArr[i][num[i] - 1] : '';
return sum;
};
console.log(convert(4)); // IV
console.log(convert(99)); // XCIX
console.log(convert(12)); // XII
console.log(convert(16)); // XVI
console.log(convert(44)); // XLIV
console.log(convert(500)); // D
console.log(convert(891)); // DCCCXCI
console.log(convert(501)); // DI
console.log(convert(649)); // DCXLIX
console.log(convert(1000)); // M
console.log(convert(1023)); // MXXIII
console.log(convert(2014)); // MMXIV
console.log(convert(3999)); // MMMCMXCIX
对象搜索算法挑战
function where(collection, source) {
var arr = [],
status = false,
i;
for (i = 0; i < collection.length; i++) {
for (j in source) {
if (collection[i][j] !== source[j]) {
status = false;
break;
}
status = true;
}
if (status)
arr.push(collection[i]);
}
return arr;
}
console.log(where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })); // [{ first: "Tybalt", last: "Capulet" }]
console.log(where([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 })); // [{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }]
console.log(where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })); // [{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }]
console.log(where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 })); // [{ "a": 1, "b": 2, "c": 2 }]
字符串查询替换算法
function myReplace(str, before, after) {
if (before.charAt(0) !== before.charAt(0).toLowerCase())
after = after.charAt(0).toUpperCase() + after.slice(1);
return str.replace(before, after);
}
console.log(myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped")); // "A quick brown fox leaped over the lazy dog"
console.log(myReplace("He is Sleeping on the couch", "Sleeping", "sitting")); // "He is Sitting on the couch"
console.log(myReplace("Let us go to the store", "store", "mall")); // "Let us go to the mall"
console.log(myReplace("Let us get back to more Coding", "Coding", "algorithms")); // "Let us get back to more Algorithms"
字符串移动插入算法
function translate(str) {
var vowels = ['a', 'e', 'i', 'o', 'u'];
if (vowels.indexOf(str.charAt(0)) != -1) {
return str + 'way';
}
while (vowels.indexOf(str.charAt(0)) == -1) {
str = str.substr(1) + str.substring(0, 1);
}
return str + "ay";
}
console.log(translate("consonant")); //onsonantcay
console.log(translate("glove")); //oveglay
console.log(translate("eight")); //eightway
字符配对算法
function pair(str) {
var creatArr = [['A', 'T'],['T', 'A'],['C', 'G'],['G', 'C']],
returnArr = [],
i, j;
for (j = 0; j < str.length; j++) {
for (i = 0; i < creatArr.length; i++) {
if (creatArr[i][0].indexOf(str[j]) != -1)
returnArr.push(creatArr[i]);
}
}
return returnArr;
}
console.log(pair("GCG")); // [["G", "C"],["C", "G"],["G", "C"]]
console.log(pair("ATCGA")); // [["A", "T"], ["T", "A"], ["C", "G"], ["G", "C"], ["A", "T"]]
console.log(pair("TTGAG")); // [["T", "A"], ["T", "A"], ["G", "C"], ["A", "T"], ["G", "C"]]
console.log(pair("CTCTA")); // [["C", "G"], ["T", "A"], ["C", "G"], ["T", "A"], ["A", "T"]]
字符串查询补充算法
function fearNotLetter(str) {
var _return;
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i + 1) - str.charCodeAt(i) > 1) {
_return = String.fromCharCode(str.charCodeAt(i) + 1);
break;
} else {
_return = undefined;
}
}
return _return;
}
console.log(fearNotLetter("abce")); // d
console.log(fearNotLetter("abcdefghjklmno")); // i
console.log(fearNotLetter("bcd")); // undefined。
输入检查算法
function boo(bool) {
bool = typeof bool === 'boolean' ? true : false;
return bool;
}
console.log(boo(true)); // true
console.log(boo(false)); // fasle
console.log(boo({"a": 1})); // false
console.log(boo([].slice)); // false
console.log(boo("true")); // false
console.log(boo("false")); // false
console.log(boo(NaN)); // false
数组去重算法
function unite(arr1, arr2, arr3) {
var returnArr = [];
for (var i = 0; i < arguments.length; i++) {
for (j = 0; j < arguments[i].length; j++) {
if (returnArr.indexOf(arguments[i][j]) < 0)
returnArr.push(arguments[i][j]);
}
}
return returnArr;
}
console.log(unite([1, 3, 2], [5, 2, 1, 4], [2, 1])); // [1, 3, 2, 5, 4]
console.log(unite([1, 3, 2], [1, [5]], [2, [4]])); // [1, 3, 2, [5], [4]]
console.log(unite([1, 2, 3], [5, 2, 1])); // [1, 2, 3, 5]
console.log(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])); // [1, 2, 3, 5, 4, 6, 7, 8]
html符号转实体算法
function convert(str) {
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
}
console.log(convert("Dolce & Gabbana")); // Dolce & amp; Gabbana
console.log(convert("Hamburgers < Pizza < Tacos")); // Hamburgers & lt; Pizza & lt; Tacos
console.log(convert("Sixty > twelve")); // Sixty & gt; twelve
console.log(convert('Stuff in "quotation marks"')); // Stuff in & quot; quotation marks & quot;
console.log(convert("Shindler's List")); // Shindler & apos; s List
console.log(convert("<>")); // & lt;& gt;
console.log(convert("abc")); // abc
字符串连接算法
function spinalCase(str) {
var arr = str.split(/[\n\s\_]/g);
if (arr.length <= 1)
return str.replace(/([A-Z])/g, "-$1").toLowerCase();
else
return arr.join('-').toLowerCase();
}
console.log(spinalCase('This Is Spinal Tap')); //this-is-spinal-tap
console.log(spinalCase("The_Andy_Griffith_Show")); //the-andy-griffith-show
console.log(spinalCase("thisIsSpinalTap")); //this-is-spinal-tap
斐波纳契奇数求和算法
function sumFibs(num) {
var a = 1,b = 1,c = 2,sum = 2;
if (num == 1)
sum = 1;
else {
for (; c <= num; a = b, b = c, c = a + b) {
if (c % 2 == 1) sum += c;
}
return sum;
}
console.log(sumFibs(4)); // 5
console.log(sumFibs(1000)); // 1785。
console.log(sumFibs(4000000)); // 4613732。
console.log(sumFibs(75024)); // 60696。
console.log(sumFibs(75025)); // 135721。
质素求和算法
function sumPrimes(num) {
var sum = 0;
for (var i = 2; i <= num; i++) {
var j = 2;
for (; i % j != 0; j++) {}
if (i == j) sum += i;
}
return sum;
}
console.log(sumPrimes(10)); // 17
console.log(sumPrimes(977)); // 73156
最小公倍数算法
/**最小公倍数:
* @param 公式法:由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。
* 即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,可以先求出它们的最大公约数。
*/
function smallestCommons(arr) {
var min = Math.min(...arr),
max = Math.max(...arr);
for (var i = min; i <= max; i++) {
min *= i / gcd(i, min);
}
return min;
}
// 求最大公约数
function gcd(i, m) {
if (i % m === 0) return m;
return gcd(m, i % m);
}
/**例子
* @param 例子1:[1,5] 1*2/1*3/1*4/2*5/1=60
* @param 例子2:[5,9] 5*6/1*7/1*8/2*9/3=2520
* @param 例子3:[1,13] 1*2/1*3/1*4/2*5/1*6/6*7/1*8/4*9/3*10/10*11/1*12/12*13/1=360360
* @param 例子4:[18,20] 18*19/1*20/2=3420
*/
console.log(smallestCommons([1, 5])); // 60
console.log(smallestCommons([5, 9])); // 2520
console.log(smallestCommons([1, 13])); // 360360
console.log(smallestCommons([18, 20])); // 3420
数组验证算法挑战
function find(arr, func) {
var num = arr.filter(func)[0];
return num;
}
console.log(find([1, 2, 3, 4], function(num) {return num % 2 === 0;})); // 2
console.log(find([1, 3, 5, 8, 9, 10], function (num) {return num % 2 === 0;})); // 8
console.log(find([1, 3, 5, 9], function (num) { return num % 2 === 0; })); // undefined
数组取值算法
function drop(arr, func) {
var newArr = [];
for (i = 0; i < arr.length; i++) {
if (func(arr[i])) {
newArr = arr.slice(i);
break;
}
}
return newArr;
}
console.log(drop([1, 2, 3], function(n) {return n < 3;})); // [1,2,3]
console.log(drop([1, 2, 3, 9, 2], function(n) {return n > 2;})); //[3, 9, 2]
console.log(drop([0, 1, 0, 1], function (n) { return n === 1;}));// [1, 0, 1]
数组平铺算法
function steamroller(arr) {
var result = [];
(function steam(ifArr) {
if (Array.isArray(ifArr)) {
ifArr.forEach(function (val) {
return steam(val);
});
} else {
result.push(ifArr);
}
})(arr);
return result;
}
console.log(steamroller([[["a"]], [["b"]]])); // ["a", "b"]。
console.log(steamroller([1, [2], [3, [[4]]]])); // [1, 2, 3, 4]
二进制转字符算法
function binaryAgent(str) {
var arr = str.split(' ');
str = '';
for (var i of arr)
str += String.fromCharCode(parseInt(i, 2));
return str;
}
console.log(binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111")); // Aren't bonfires fun!?
console.log(binaryAgent("01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001")); // I love FreeCodeCamp!
数组元素判断算法
function every(collection, pre) {
var bool = true;
for (var i of collection)
if (!i[pre]) bool = false;
return bool;
}
console.log(every([{ "user": "Tinky-Winky", "sex": "male" }, { "user": "Dipsy", "sex": "male" }, { "user": "Laa-Laa", "sex": "female" }, { "user": "Po", "sex": "female" }], "sex")); // true
console.log(every([{ "user": "Tinky-Winky", "sex": "male", "age": 0 }, { "user": "Dipsy", "sex": "male", "age": 3 }, { "user": "Laa-Laa", "sex": "female", "age": 5 }, { "user": "Po", "sex": "female", "age": 4 }], "age")); // false
函数迭代可选参数算法
function add() {
var arg = arguments,bool = true, i;
for (i = 0; i < arg.length; i++) {
if (typeof arg[i] !== 'number') {
bool = false;
break;
}
}
if (bool) {
switch (arg.length) {
case 1:
return (function () {
if (typeof arguments[0] !== 'number') return undefined;
else return arg[0] + arguments[0];
});
break;
case 2:
return arg[0] + arg[1];
break;
default:
return undefined;
break;
}
} else return undefined;
}
console.log(add(2, 3)); // 5
console.log(add('1', 1)); // undefined
console.log(add("http://bit.ly/IqT6zt")); // undefined
console.log(add(2)([3])); // undefined
console.log(add(2)(3)); // 5
有写的不好的地方欢迎大家留言讨论。