js算法题

最近在考虑面试,自己就总结了一些js算法题,希望对正在找工作的你也有帮助

1、es6方法过滤掉两个数组中对象id值相等的项

function(arr1,arr2){
 arr1.filter((item) => !arr2.some((ele) => ele.id == item.id))
}

2、判断是否回文

//如:字符串abccba,从前往后读是a-b-c-c-b-a;从后往前读也是a-b-c-c-b-a
function reserve1(str){
    return str == str.split('').reverse().join('')
}
function reserve2(str){
    var len = str.length;
    for(var i=0;i<len-1;i++){
        if(str.charAt(i)==str.charAt(len-1-i)){
            return true;
        }else{
            return false;
        }
    }
}
//console.log(reserve2('abac'))

3、数组去重

function  unique(arr){
    let newArr = []
    arr.forEach((val)=>{
        if(newArr.indexOf(val) == -1){
            newArr.push(val)
        }
    })
    return newArr
}
var arr = [1,3,4,8,1,9]
//console.log(unique(arr))

4、尾递归阶乘

function factorial(num) {
    if(num <= 1) return 1;
    return num * factorial(num - 1);

}

5、排序

//快速排序
function quickSort(arr){
    if(arr.length<=1)return arr;
    let middleIndex = Math.floor(arr.length/2)
    //console.log(middleIndex)
    let middle = arr.splice(middleIndex,1)[0]
    console.log(middle)
    let left = [],right = []
    for(var i=0;i<arr.length;i++){
        if(arr[i]>middle){
            right.push(arr[i])
        }else{
            left.push(arr[i])
        }
    }
    return quickSort(left).concat([middle],quickSort(right));
}
console.log(quickSort([2,3,1,4,6,5,9,8,7]))

//冒泡排序
function maopao(arr){
    if(arr==null || arr.length < 2 ){
        return;
    }
    for(var i=0;i<arr.length-1;i++){
        for(var j=0;j<arr.length-i-1;j++){
            if(arr[j]>arr[j+1]){
                var temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
    }
    return arr
}
var arr = [89,63,78,12,458,24,76,3,49]
console.log(maopao(arr))

6、 统计字符串出现次数最多的字母

function findMoreLetter(str){
    var arr,container = {}
    arr = str.split('')
    for(var i=0;i<arr.length;i++){
        if(container[arr[i]]){
            container[arr[i]] ++
        }else{
            container[arr[i]] = 1
        }
    }
    // 通过比较找出最大的
    var maxKey = 0,maxValue = '';
    for (let k in container) {
        if(container[k] > maxKey){
            maxKey = container[k];
            maxValue = k;
        }
    }
    return maxValue+'最多出现了'+maxKey+'次'
}
var str = 'abbbuyymmckhdtgdj'
//console.log(findMoreLetter(str))

7、自己定义的new方法

let newMethod = function(fun, ...rest){
    // 1.以构造器的prototype属性为原型,创建新对象;
    let child = Object.create(fun.prototype);
    // 2.将this和调用参数传给构造器执行
    fun.apply(child, rest);
    // 3.返回第一步的对象
    return child;
};

8、不借助临时变量,进行两个整数的交换

//方法一
function swap(a , b) {  
    b = b - a;//2
    a = a + b;//10
    b = a - b;//8
    return [a,b];
}
//console.log(swap(8,10))
方法二
[a,b] = [b,a]

9、找出下列正数组的最大差值

var arr2 =  [10,5,11,7,8,9]
function findMaxProfit(arr){
    var max = arr[0];
    var min  = arr[1]
    for(var i=0;i<arr.length;i++){
        if(arr[i]>max){
            max = arr[i]
        }
        if(arr[i]<min){
            max = min
        }
    }
    return max - min
}
//console.log(findMaxProfit(arr2));

10、随机生成指定长度的字符串,实现一个算法,随机生成指制定长度的字符窜 比如给定 长度 8 输出 4ldkfg9j

function randomString(n){
    let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
    let temp = '';
    for(var i=0;i<n;i++){
        temp += str.charAt(Math.floor(Math.random()*str.length))
    }
    return temp
}
//console.log(randomString(10))

11、 定义一个函数 求a所有约数之和

function yueShuHe(a) {
    var sum = 0;// 累加器
    for(var i=1; i<a; i++) {
        if(a%i==0) {
            sum = sum + i;
        }
    } 
    return sum; 
}

12、找亲密数

for(var num1 = 1; num1<=3000; num1++) {
    var num2 = yueShuHe(num1);
    if(num1==yueShuHe(num2) && num1 != num2) {
        console.log(num1,num2);
    }
}

13、输入一个3位数,求这个数的和

function sumNumber(num){
    var bai,shi,ge,sum
    bai = parseInt(num/100)
    shi = parseInt(num/10)%100
    ge = num%10
    sum = bai + ge + shi;
    return  sum;
}

14、写出代码对下列数组去重并从大到小排列{5,2,3,6,8,6,5,4,7,1,9}

function fn(arr){
    var arr1 = []
    for(var i=0;i<arr.length;i++){
        if(arr1.indexOf(arr[i])==-1){
            arr1.push(arr[i])
        }
    }
    return arr1.sort().join(',')
}
// var arr = [5,2,3,6,8,6,5,4,7,1,9]
// console.log(fn(arr))

15.用 JavaScript 实现冒泡排序。数据为 23、45、18、37、92、13、24

function maoPaoSort(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=0;j<arr.length-i;j++){
            if(arr[j]>arr[j+1]){
                var temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
    }
    return arr.toString()
}
//console.log(maoPaoSort([23,45,18,37,92,13,24]));

16、用 js 实现随机选取 10–100 之间的 10 个数字,存入一个数组,并排序。

function randomNumberSort(len,max,min){
    var transition = max - min + 1;//这里面的加1是为了能够取到100
    var arr = []
    for(var i = 0; i < len; i++){
        var num = Math.floor(Math.random() * transition + min);
        arr.push(num)
    }
    arr = arr.sort()
    return arr;
}
console.log(randomNumberSort(10,100,10))

17、已知数组 var stringArray = [“This”, “is”, “Baidu”, “Campus”], Alert 出”This is Baidu Campus”。

var stringArray = ["This", "is", "Baidu", "Campus"]
//console.log(stringArray.join(" "))

18、已知有字符串 foo=”get-element-by-id”,写一个 function 将其转化成 驼峰表示法”getElementById”。

var foo ="get-element-by-id"
var arrFoo = foo.split('-')
for(var i=0;i<arrFoo.length;i++){
    arrFoo[i] = arrFoo[i].charAt(0).toUpperCase()+arrFoo[i].substr(1,arrFoo[i].length-1)
}
var msg = arrFoo.join('')
console.log(msg)

19、下面这段 JS 输出什么,并简述为什么?

function Foo() { 
    var k = 0;
    return function () { 
        console.log(k++); 
    }}
var f1 = Foo(), f2 = Foo();
// f1()
// f1()
// f2()
//  console.log(k)

20、有这样一个 URL: http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一 段 JS 程序提取 URL 中的各个 GET 参数(参数名和参数个数不确定),将其按 key-value 形式返回到一个 json 结构中,如{a:’1′, b:’2′, c:”, d:’ xxx’, e:undefined}。

 function serilizeUrl(url){
    if(url.indexOf('?')==-1){
        return;
    }
    var urlObject = {};
    var urlString = url.substring(url.indexOf('?')+1)
    var urlArr = urlString.split('&')
    for(var i=0;i<urlArr.length;i++){
        var urlItem = urlArr[i]; 
        var item = urlItem.split("="); 
        urlObject[item[0]] = item[1];
    }
    return urlObject
}
// var url = 'http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e';
// console.log(serilizeUrl(url))

21、输出今天的日期,以 YYYY-MM-DD 的方式,比如今天是 2014 年 9 月 26 日,则输出 2014-09-26

function getToday(){
    var date = new Date()
    var year = date.getFullYear()
    var month = date.getMonth()+1
    month = month < 10 ? '0' + month : month
    var day = date.getDate()
    day = day < 10 ? '0' + day : day
    return `今天是${year}年${month}月${day}日`
}
//console.log(getToday())
// Console.log(undefined || 1);//值___1__ 
// Console.log(null || NaN);//值__NaN___ 
// Console.log(0 && 1);//值__0___ 
// Console.log(0 && 1 || 0);//值__0___

22、以下 js 的运行结果是什么,为什么?

var txt='hx';
function hello(){ 
    var txt; 
    fn();//world 函数名与变量名重复的时候,以函数名为主 
    var fn=function(){
        console.log('hello')
    } 
    function fn(){
        console.log('world');
    } 
    console.log(txt);//undefined 局部变量,只是声明,没有赋值 
    fn();//hello 先进行声明,后赋值,执行 fn=function(){alert('hello')} 
}
//hello();

23、把两个数组合并,并删除第二个元素。

var array1 = ['a','b','c']; 
var bArray = ['d','e','f'];
var carray = array1.concat(bArray)
carray.splice(1,1)
//console.log(carray)

24、写一个 function,清除字符串前后的空格。(兼容所有浏览器)

function trim(str){
    str.replace(/^\s+/, "").replace(/\s+$/,"");

    // if (!String.prototype.trim) { 
    //     String.prototype.trim = function() { 
    //         return this.replace(/^\s+/, "").replace(/\s+$/,""); 
    //     }}
    // }
}

var arr = new Array(1 ,3 ,5); 
arr[4]='z'; 
arr2 = arr.reverse(); 
arr3 = arr.concat(arr2);
//console.log(arr3);

25、数字转换成千分位 如:12,876,977.98

方法一:function RMB(number){
    var list = number.toString().split('').reverse()
    var obj =[];
    for(var i=0;i<arr.length;i++){
        if(i%3==0 && i!=0){
            obj.push(',')
        }
        obj.push(arr[i])
    }
    return  obj.reverse().join('')
}
方法二 : function convert(number){
    var list = number.toString().split('').reserve()
    for(var i=0;i<list.length;i++){
        if(i%4 === 3){
            list.splice(i,0,',')
        }
    }
    return list.reverse().join('')
}

准备一个月份反转的数组

var _date=[],dateData=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"];
var dateDataRet = Object.assign([],dateData).reverse();
//获取当前年份 
var yearText= new Date().getFullYear();
var now  = new Date().getMonth();
for (let i=0;i<6;i++){
    if(now-i<0){
        _date.push(yearText-1+'年'+dateDataRet[Math.abs(now-i)-1]);
    }else{
        _date.push(yearText+'年'+dateData[now-i]);
    }
}
_date.reverse()
console.log(_date)

26、获取url中的参数,并返回一个对象{key:value}格式

let urlStr = 'http://www.inode.club?name=koala&study=js&study=node'
function queryString(url){
    let params = url.split('?')[1];
    let param = params.split('&')
    // console.log(param)
    let obj = {}
    for(var i=0;i<param.length;i++){
        let paramA = param[i].split('=')
        // console.log(paramA)
        let key = paramA[0]
        let value = paramA[1]
        if(obj[key]){
            obj[key] = Array.isArray(obj[key])?obj[key]:[obj[key]];
            obj[key].push(value);
        }else{
            obj[key] = value
        }
    }
    return obj;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。