题目:www.freecodecamp.cn/challenges/…正则表达式
参考博客:singsing.io/blog/fcc/ba…数组
若是数组第一个字符串元素包含了第二个字符串元素的全部字符,函数返回 true 。 举例,["hello", "Hello"]应该返回 true,由于在忽略大小写的状况下,第二个字符串的全部字符均可以在第一个字符串找到。app
思路:函数
String.toLowerCase()
String.indexOf()
function mutation(arr) {
const s1 = arr[0].toLowerCase()
const s2 = arr[1].toLowerCase()
let result = true
for (let i of s2) {
if (s1.indexOf(i) === -1) {
result = false
return result
}
}
return result;
}
mutation(["hello", "hey"]);
// 能够不用 result
function mutation(arr) {
const s1 = arr[0].toLowerCase()
const s2 = arr[1].toLowerCase()
for (let i of s2) {
if (s1.indexOf(i) === -1) {
return false
}
}
return true
}
mutation(["hello", "hey"])
复制代码
博客的思路:利用 filter
测试
function mutation(arr) {
var sourceStr = arr[0].toLowerCase();
var targetArr = arr[1].toLowerCase().split("");
var filteredArr = targetArr.filter(function (char) {
return sourceStr.indexOf(char) === -1;
})
return filteredArr.length === 0;
}
复制代码
filter
的思路就是利用数组的遍历,那么咱们也能够用数组的 every
呀优化
// 试一试
function mutation(arr) {
const s = arr[0].toLowerCase()
const a = arr[1].toLowerCase().split('')
return a.every(item => s.indexOf(item) !== -1)
}
// 简洁点
function mutation(arr) {
return arr[1].toLowerCase().split('').every(item => arr[0].toLowerCase().indexOf(item) !== -1)
}
mutation(["hello", "hey"]);
复制代码
题目:www.freecodecamp.cn/challenges/…ui
参考博客:singsing.io/blog/fcc/ba…spa
删除数组中的全部假值。code
思路: 遍历数组的元素,判断是否为真,为真的话放进一个数组内,最后返回该数组。regexp
function bouncer(arr) {
return arr.reduce((arr, item) => item ? arr.concat(item) : arr, [])
}
bouncer([7, "ate", "", false, 9]);
复制代码
后面想一想,上一题的 filter
,这里更应该用过滤的
function bouncer(arr) {
return arr.filter(item => item)
// 博客里的是用了 !! 去作隐式转换,不知道有没有必要这样作。
// return arr.filter
}
bouncer([7, "ate", "", false, 9]);
// 而后 Boolean 是接受一个参数返回布尔值的构造函数,filter 接受的也是一个函数,该函数返回布尔值。
const bouncer = arr => arr.filter(Boolean)
复制代码
// 初次解法
function destroyer(...arr) {
const a1 = arr[0]
const a2 = arr.slice(1)
return a1.reduce((arr, val) => a2.indexOf(val) === -1 ? arr.concat(val) : arr, [])
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
复制代码
再理解下题意,发现应该用的是 filter
function destroyer(...arr) {
const a1 = arr[0]
const a2 = arr.slice(1)
return a1.filter(item => a2.indexOf(item) === -1)
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
复制代码
题意: 一个数组,一个数字,而后这个数字在这个数组中,按小到大排序,它的下标应该是多少。
解法一:
push, concat
sort
indexOf, findIndex
note:
indexOf
:expects a value as first parameter.findIndex
:expects a callback as first parameter.findIndex
,好比是查找 item.xx
这样的话就要用 findIndex
function where(arr, num) {
arr.push(num)
arr.sort((a, b) => a - b)
return arr.indexOf(num)
}
where([40, 60], 50);
复制代码
解法二:不去排序,咱们去遍历,而后计数
function where(arr, num) {
var count = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] < num) {
count++;
}
}
return count;
}
where([40, 60], 50);
// 一样是遍历,只不过用的是 filter
function where(arr, num) {
return arr.filter(item => item < num).length;
}
// 固然你用 map, reduce 也行,map 麻烦一些,其实仍是用了遍历 + 计数的方式
const where = (arr, num) => arr.reduce((acc, item) => item > num ? acc.concat(item) : acc, []).length
where([40, 60], 50);
复制代码
题意: 给你一个大写字母的字符串,而后你把字符串的每个字母向右移动13位,超出了再循环回来,组成一个新的字符串返回。
须要用到的:
String.charCodeAt()
String.fromCharCode()
分割成数组再遍历,最后拼接字符串
function rot13(str) { // LBH QVQ VG!
var arr = str.split('');
return arr.map(item => /[A-Z]/.test(item) ? String.fromCharCode(item.charCodeAt() % 26 + 65) : item).join('');
}
rot13("SERR PBQR PNZC"); // 你能够修改这一行来测试你的代码
// /[A-Z]/.test(item) 只替换大写字符
// item.charCodeAt() % 26 + 65 只是由于 'A'.charCodeAt() => 65, x % n = [0, n - 1]
复制代码
replace()
替换function rot13(str) { // LBH QVQ VG!
return str.replace(/[A-Z]/g, char => {
return String.fromCharCode(char.charCodeAt() % 26 + 65)
})
}
rot13("SERR PBQR PNZC"); // 你能够修改这一行来测试你的代码
复制代码
题意:给一个数组,而后返回给定范围的数字总和。
例如:[1, 4] => 1+2+3+4=10 返回 10
数学公式解法:n + n+1 + n+2 + ... + m = (n+m)(m-n+1)/2 = (m^2-n^2+n+m)/2
function sumAll(arr) {
var a = arr[0], b = arr[1];
return (Math.abs(a*a - b*b) + a+b) / 2;
}
sumAll([1, 4]);
复制代码
循环叠加解法:首先要判断两数的大小,再循环叠加
function sumAll(arr) {
var a = arr[0], b = arr[1], result = 0;
if (a > b) {
// 交换
[a, b] = [b, a];
}
while(b >= a) {
result += a;
a++;
}
return result;
}
sumAll([1, 4]);
复制代码
博客的另外一种解法:生成一个数组[n, n+1, n+2, ... , m],再遍历求和。
function sumAll(arr) {
var numArr = Array.from({length: Math.abs(arr[0] - arr[1]) + 1}, (_, i) => i + Math.min.apply(null, arr));
return numArr.reduce((prev, next) => prev + next);
}
// 上面每次都要拿一次最小值,其实能够提取出来的
// 也能够用 Array() + Array.fill()
function sumAll(arr) {
var min = Math.min(...arr); // var min = Math.min.apply(null, arr);
var numArr = Array(Math.abs(arr[0] - arr[1]) + 1).fill(min);
return numArr.reduce((acc, val, index) => acc + val + index);
}
复制代码
题意:比较两个数组,而后返回一个新数组,该数组的元素为两个给定数组中全部独有的数组元素。换言之,返回两个数组的差别。
按照数学上集合来说就是,两个集合并集减去它们的交集。
function diff(arr1, arr2) {
var sum = [...new Set([...arr1, ...arr2])];
return sum.filter(item => arr1.indexOf(item) === -1 || arr2.indexOf(item) === -1);
}
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);
复制代码
上面那个感受有点麻烦,又是拼接数组,又是集合转数组,虽然能够去除,可是看起来复杂了。
能够直接拼接数组再过滤就好了。
function diff(arr1, arr2) {
return arr1.concat(arr2).filter(item => arr1.indexOf(item) === -1 || arr2.indexOf(item) === -1)
}
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);
复制代码
题意:
// 首先返回的是数组,那么用 filter
// 其次是数组的元素里要包含对象的键值 Object.keys(obj) 返回给对对象可枚举属性(key)的字符串数组。
// 为何是字符串数组,由于对象属性都会转为字符串。
function where(collection, source) {
return collection.filter(item => Object.keys(source).every(key => source[key] === item[key]));
}
where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
复制代码
题意:
思路一:
function myReplace(str, before, after) {
var arr = str.split(' ');
if (before.slice(0, 1).charCodeAt() < 91) {
// 判断条件用正则表达式也ok /[A-Z]/.test(before[0])
after = after[0].toUpperCase() + after.slice(1);
}
arr.splice(arr.indexOf(before), 1, after);
return arr.join(' ');
}
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
复制代码
思路二:直接字符串替换
function myReplace(str, before, after) {
if (/[A-Z]/.test(before[0])) {
after = after[0].toUpperCase() + after.slice(1);
}
return str.replace(before, after);
}
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
复制代码
题目意思就是:给你一段残缺的碱基,返回一段碱基对,碱基对有:A => T,C => G
输入:GCG 输出:[["G", "C"], ["C","G"],["G", "C"]]
思路:
map
去遍历生成新数组。// 这样的话,取的时候方便一些
var obj = {
'A': ['A', 'T'],
'T': ['T', 'A'],
'C': ['C', 'G'],
'G': ['G', 'C']
};
// 这样的话就要拼接
var obj = {
A: 'T',
T: 'A',
C: 'G',
G: 'C'
}
复制代码
function pair(str) {
// 这个对象的属性能够不一样加引号,它会自动转换为字符串的。
var obj = {
A: ['A', 'T'],
T: ['T', 'A'],
C: ['C', 'G'],
G: ['G', 'C']
};
return str.split('').map(function(item) {
return obj[item];
});
}
pair("GCG");
function pair(str) {
var obj = {
A: 'T',
T: 'A',
C: 'G',
G: 'C'
};
return str.split('').map(function(item) {
return [item, obj[item]];
});
}
pair("GCG");
复制代码