fcc算法中级
范围内的数字求和
给出一个含有两个数字的数组,我们需要写一个函数,让它返回这两个数字间所有数字(包含这两个数字)的总和。注意,较小数不一定总是出现在数组的第一个元素。
水体,比较两个临界值的大小,再循环相加即可
function sumAll(arr) {
if(arr[0] > arr[1]){
let temp = arr[0]
arr[0] = arr[1]
arr[1] = temp
}
let sum = 0;
for(var i = arr[0]; i <= arr[1]; i++){
sum += i
}
return sum;
}
sumAll([1, 4]);
但是这里比较大小也太low了吧!具有学习精神的程序员表示不能忍受
改用Math方法比较大小
var max = Math.max(arr[0], arr[1]);
var min = Math.min(arr[0], arr[1]);
还有因为传入的参数是数组,使用js扩展运算符
for (var i = Math.min(...arr); i <= Math.max(...arr); i++) {
sum += i;
}
区分两个数组
在这道题目中,我们需要写一个函数,比较两个数组,返回一个新的数组。这个新数组需要包含传入的两个数组所有元素中,仅在其中一个数组里出现的元素。如果某个元素同时出现在两个数组中,则不应包含在返回的数组里。换言之,我们需要返回这两个数组的对称差。
注意:
返回数组中的元素顺序不会影响测试结果
让两数组去重,可以使用循环和indexOf()的方法
简单粗暴的方法:
function diffArray(arr1, arr2) {
var newArr = [];
// 这是一个党异伐同的过程
for(var i = 0; i< arr1.length; i++)
{
if(arr2.indexOf(arr1[i]) === -1)
{
newArr.push(arr1[i])
}
}
for(var i = 0; i< arr2.length; i++)
{
if(arr1.indexOf(arr2[i]) === -1)
{
newArr.push(arr2[i])
}
}
return newArr;
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
是用filter()循环并筛选,indexOf()方法比较是否存在
function diffArray(arr1, arr2) {
return arr1.concat(arr2)
.filter((e)=>{
// 去除既在第一个数组中存在又在第二个数组中存在的值
return !(arr1.indexOf(e) !== -1 && arr2.indexOf(e) !== -1)
})
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
瞄准和消灭
在这道题目中,我们要写一个叫destroyer
的函数。传给它的第一个参数是数组,我们称他为初始数组。后续的参数数量是不确定的,可能有一个或多个。你需要做的是,从初始数组中移除所有与后续参数相等的元素,并返回移除元素后的数组。
注意:
你可以使用arguments
对象,也可以使用...
,即“剩余参数”(Rest Parameters)语法。
查阅MDN arguments对象的用法,MDN arguments
使用arguments对象,构造一个除第一个数组外的值的数组,再使用filter()排除和该数组相同的值
function destroyer(arr) {
// 删掉那些值
var args = Array.from(arguments).slice(1);
return arr.filter(function(val) {
return !args.includes(val);
});
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
使用剩余参数的方法,第一个数组后面的参数构造成一个数组
const destroyer = (arr, ...val) => {
return arr.filter(e=>{
return !val.includes(e)
})
}
// 函数只有一条语句,可以省略return,优美!
const destroyer = (arr, ...val) => arr.filter(e => !val.includes(e))