# 牛客网评测
# 移除数组中的元素(返回原数组)
输入:[1,2,2,3,4,2,2], 2
输出: [1,3,4]
1
2
2
function removeWithoutCopy(arr, item) {
for(let i=arr.length;i>=0;i--){
if(arr[i]==item){
arr.splice(i,1);
}
}
return arr;
}
// 另一种写法,记得删除元素后位置往前移
function removeWithoutCopy(arr, item) {
for(let i = 0; i< arr.length; i++) {
if(arr[i]===item) {
arr.splice(i,1);
i--;
}
}
return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 计数
输入:[1,2,4,4,3,4,3], 4
输出: 3
1
2
2
function count(arr, item) {
let res = arr.reduce( (init,curr)=> {
//如果当前置等于item,该函数值加一
return curr === item ? init+1:init;
},0)
return res;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 查找重复元素
找出数组重复出现过的元素
function duplicates(arr) {
var resArr=[];
arr.forEach(v => {
//判断原数组是否有重复数据
//判断结果数组是否已经具有该数据
if(arr.indexOf(v) !=arr.lastIndexOf(v) && resArr.indexOf(v) == -1){
resArr.push(v);
}
});
return resArr;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 计时器
实现一个打点计时器,要求
- 从
start到end(包含start和end),每隔100毫秒console.log一个数字,每次数字增幅为 1 - 返回的对象中需要包含一个
cancel方法,用于停止定时操作 - 第一个数需要立即输出
function count(start, end) {
//立即输出第一个值
console.log(start++);
var timer = setInterval(
function() {
if(start <= end){
console.log(start++);
}else{
clearInterval(timer);
}
},100);
//返回一个对象
return {
cancel : function() {
clearInterval(timer);
}
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用闭包
实现函数 makeClosures,调用之后满足如下条件:
- 返回一个函数数组
result,长度与arr相同 - 运行
result中第i个函数,即result[i](),结果与fn(arr[i])相同
function makeClosures(arr, fn) {
let result = [];
for (let i of arr) {
result.push(()=>{
return fn(i)
});
}
return result;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 二次封装函数
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
- 返回一个函数
result,该函数接受一个参数 - 执行
result(str3),返回的结果与fn(str1, str2, str3)一致
function partial(fn, str1, str2) {
return result = function (str3) {
return fn(str1, str2, str3)
};
}
1
2
3
4
5
2
3
4
5
# 乘法
求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题
function multiply(a, b) {
// 先将数字转换为字符串
let str1 = a.toString();
let str2 = b.toString();
// 获取两个数的小数位数
let lenA = (str1.indexOf('.')==-1)?0:(str1.length-str1.indexOf(".")-1);
let lenB = (str2.indexOf('.')==-1)?0:(str2.length-str2.indexOf(".")-1);
// 比较两数的精度/位数,精度大的作为结果数精度
let len = Math.max(lenA,lenB);
// 运算结果
let result = parseFloat(a*b).toFixed(len);
return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 对象属性遍历
找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
- 返回数组,格式为
key: value - 结果数组不要求顺序
function iterate(obj) {
let result = [];
for(let key in obj){
if(obj.hasOwnProperty(key)){
result.push(key+': '+obj[key]);//使用obj.key部分代码不能通过
}
}
return result;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
TIP
其他解法:
- 利用
Object.key()然后得到key属性,循环遍历即可 - 还可以利用
Object.getOwnPropertyNames()