面试题 前端算术题小集合

一 字符串新增方法实现功能

字符串对象定义一个addPrefix函数,当传入一个字符串str时,他会返回新的带有指定前缀的字符串,例如:

console.log("world".addPrefix("hello"))

控制台会输出“hello world”

String.prototype.addPrefix = function(str){
    return str + ' ' +this
}
console.log("world".addPrefix("hello")) // hello world

二 求100以内的质数

质数只能被自己和1整除

let count;
for(let i = 2; i < 100; i++){
    for(let j = 1; j <= i; j++){
        if(i % j === 0){
            count++
        }
    }
    //从1开始,到自身都被%完,1自身整除,count===2
    if(count===2){
        console.log(i)
    }
    count = 0
}

三 在一个数组中找到两个数的和为目标值的数,并且返回它们的下标

let nums = [2, 8, 7, 11]
let nums1 = [2, 8, 7, 11, 1]
let target = 9
  
function twoSum(nums, target){
    for(let i = 0; i < nums.length; i++){
        let num = nums[i]
        let targetIndex = nums.indexOf(target - num)
        //存在,且不只一个数
        if(targetIndex > -1 && targetIndex !== 1){
            return [i, targetIndex]
        } 
    }
}
console.log(twoSum(nums, target)); //[ 0, 2 ]
//该方法有bug,只能找到一组
console.log(twoSum(nums, target)); //[ 0, 2 ]

四 数组随机排序

sort()+Math.random() 物质范围[0, 1)
var arr = [1, 2, 3, 4, 5]
  
arr.sort(function () {
  return Math.random() - 0.5
})
console.log(arr);

sort运行机制是两个数两个数的比较,缺点不够随机

2 循环+Math.random() 随机下标,两数交换位置

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  
function randomArr(arr){
    for(let i = 0; i < arr.length; i++){
        //获取随即下标准
        let randomIndex = parseInt(Math.random() * arr.length);
        //存下当前数值
        let curNum = arr[i]
        //交换两个值
        arr[i] = arr[randomIndex]
        arr[randomIndex] = curNum
    }
    return arr
}
console.log(randomArr(arr));
3 洗牌算法

五 数组扁平化

数组的扁平化其实就是将一个嵌套多层的数组 array(嵌套可以是任何层数)转换为只有一层的数组

1 ES6 数组新增flat API
var arr = [1, [2, [3, 4, 5]]];
// 参数为想要扁平化的数组的嵌套层数,Infinity参数为无论嵌套多少层,都转化为一维数组
const newArr1 = arr.flat(1) 
const newArr2 = arr.flat(Infinity) 
console.log(newArr1) //[ 1, 2, [ 3, 4, 5 ] ]
console.log(newArr2) //[ 1, 2, 3, 4, 5 ]

2 循环+concat()

var arr = [1, [2, [3, 4, 5]]];
const flattern = function(arr){
    while(arr.some(value=>Array.isArray(value))){
        arr = [].concat(...arr);
    }
    return arr;
}
console.log(flattern(arr))

3 递归+concat()

var arr = [1, [2, [3, 4, 5]]];
const flattern = function(arr){
    return [].concat(...arr.map(v=>Array.isArray(v)?flattern(v):v))
}
console.log(flattern(arr))

六 求多维数组最大值

大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们组成为一个新数组

let arr = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]
function fnArr(arr){
    let newArr = []
    arr&&arr.map(item=>{
        newArr.push(Math.max(...item))
    })
    return newArr
}
console.log(fnArr(arr))  //[ 5, 27, 39, 1001 ]

七 找出字符串出现最多次数的字符以及次数

判断一个字符串中出现次数最多的字符,并统计次数

let str = 'aaabbbcccaaabbbaaabbbbbbbbbbb'

let str = 'aaabbbcccaaabbbaaabbbbbbbbbbb';
let obj = {};
for(let i = 0; i < str.length; i++){
    let char = str.charAt(i);
    //如果有该元素,次数+1
    if(obj[char]){
        obj[char]++;
    }else{
        obj[char] = 1;
    }
}
console.log(obj) // { a: 9, b: 17, c: 3 }
 
//获取最大值
let max = 0;
for(let key in obj){
    if(max < obj[key]){
        max = obj[key]
    }
}
console.log(max) // 17

八 提取url的参数

let url = "https://www.bilibili.com/video/BV1ZZ421h79b?p=5&spm_id_from=pageDriver&vd_source=28c6dd538bc85e3a1569928075bbb887"
function queryURLParams(URL){
    let url = URL.split("?")[1];
    const urlSearchParams = new URLSearchParams(url);
    const params = Object.fromEntries(urlSearchParams.entries());
    return params;
}
console.log(queryURLParams(url));
// {
//     p: '5',
//     spm_id_from: 'pageDriver',
//     vd_source: '28c6dd538bc85e3a1569928075bbb887'
// }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值