Javascript

js数组的相关算法题

本文主要是介绍js数组的相关算法题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

js数组的相关算法题

  • 一、输出1-100之间所有的素数之和
  • 二、阶乘算法
  • 三、字符串去重
    • 方法1:es6写法
    • 方法2:数组方法进行去重
    • 方法3:使用数组+对象的方法去重
  • 四、字符串原位翻转
  • 五、查找字符串中元素个数最多的元素,并且输出个数
  • 六、数字转化为money的格式
  • 七、数组降维
  • 八、在一个数组中查找值,返回值对应索引的集合
  • 九、寻找两个数组中相同的元素中最小的元素
  • 十、给定一个数组,里面任意两个数之和等于一个值,输出可能的几种情况
  • 十一、找数组内部缺失值,使得数组值是连续的
  • 十二、数组面试题
    • 题一
    • 题二
    • 题三

一、输出1-100之间所有的素数之和

    var sum=0;
    for(var i=2;i<=100;i++){
        for(var j=2;j<i;j++){
            if(i%j==0){
                break;
            }

        }
        if(j>=i){
            sum+=i;
        }
    }
    console.log(sum); 
    function allCount(args){
        if(typeof args=="number"){
            var sum=0;
            for(var i=0;i<=args;i++){
                if(check(i)){
                    sum+=i;
                }
            }
            return sum;
        }
    }
    function check(num){
        if(num>=2){
            var bool=true;
            for (var k = 2; k < num; k++) {
                if (num % k == 0) {
                    bool = false;
                    break;
                }
            }
            return bool;
        }
    }
    console.log(allCount(100)); 

二、阶乘算法

    function recursive(args){
        if(args<=1){
            return 1;
        }
        return args*recursive(args-1);
    }
    console.log(recursive(5));//120 

三、字符串去重

方法1:es6写法

    var str="abcdabcdaaaabbbbccccdddd";
    function checkStr(){
        var arr=str.split("");
        return new Set(arr).join("");
    }
    console.log(checkStr(str));//abcd 

方法2:数组方法进行去重

    var str="abcdabcdaaaabbbbccccdddd";
    function checkStr(){
        var arr=str.split("");
        for(var i=0;i<arr.length;i++){
            for(var k=i+1;k<arr.length;k++){
                if(arr[i]==arr[k]){
                    arr.splice(k,1);
                    k--;
                }
            }
        }
        return arr.join("");
    }
    console.log(checkStr(str));//abcd 

方法3:使用数组+对象的方法去重

    var a=[1,1,2,2,3,4,5,5];
    function unique(args){
        var item=[];
        var obj={};
        for(var i=0;i<args.length;i++){
            if(!obj[args[i]]){
                obj[args[i]]=1;
                item.push(args[i]);
            }
        }
        return item;
    }
    console.log(unique(a));// [1, 2, 3, 4, 5] 

四、字符串原位翻转

    var str="I am a Student";
    var s=str.split(" ");
    var data= s.map(function(value,index){
        return value.split("").reverse().join("");
    })
    console.log(data); 
    var str="I am a Student";
    console.log(str.split("").reverse().join("").split(" ").reverse()); 

五、查找字符串中元素个数最多的元素,并且输出个数

    var str="aabbbccdddddjjjnnmaaa";
    function findstr(args){
        var arr=args.split("");
        var num=0;//记录当前字符为几个
        var list=[];
        for(var i=0;i<arr.length;i++){
            var count=1;
            for(var k=i+1;k<arr.length;k++){
                if(arr[i]===arr[k]){
                    count++;
                    arr.splice(k,1);
                    k--;
                }
            }
            if(count>num){
                num=count;
                list[0]=[arr[i],num];
            }
            else if(count==num){
                list[list.length]=[arr[i],num];
            }

        }
        return list;

    }
    console.log(findstr(str)); 

966666669++8888888888888888888888888888888

六、数字转化为money的格式

    var money=10000000000;
    console.log(money.toLocaleString());//10,000,000,000 

七、数组降维

    var array=[1,[2,3],[4,5],[[6,7]],[[[[[8]]],[9,10]]],[[[[[11]]]]]];
    var info=[];
    function arraychange(args){
        for(var i=0;i<args.length;i++)
        {
            if(Array.isArray(args[i]))
            {
                //继续
                arraychange(args[i]);
            }
            else{
                info.push(args[i]);
            }
        }
    }
    arraychange(array);
    console.log(info);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 

八、在一个数组中查找值,返回值对应索引的集合

    var arr=[1,2,3,4,1,2,3,4,1,2,3,4];
    var num=4;
    var list=[];
    function checkIndex(array,n){
        for(var i=0;i<array.length;i++){
            if(array[i]==n){
                list.push(i);
            }
        }
        console.log(list);//[3, 7, 11]
    }
    checkIndex(arr,num); 

九、寻找两个数组中相同的元素中最小的元素

    var a=[1,2,3,4,5,6];
    var b=[1,3,5,7,9,5,10,7];
    function method(arr1,arr2){
        var list=[];
        for(var i=0;i<arr1.length;i++){
            for(var k=0;k<arr2.length;k++){
                if(arr1[i]==arr2[k]&&list.indexOf(arr1[i])==-1){
                    list.push(arr1[i]);
                }
            }
        }
        console.log(Math.min.apply(null, list));//1
    }
    method(a,b); 

十、给定一个数组,里面任意两个数之和等于一个值,输出可能的几种情况

    var info=[1,2,3,7,4,5,6,7,7,1,8,9];
    var num=8;
    function Count(array,n){
        var list=[];
        for(var i=0;i<array.length;i++){
            //检测当前值是否已经存在
            var ishas=true;
            list.forEach(function(item){
                if(item.indexOf(array[i])!=-1){
                    ishas = false;
                    return;
                }
            });
            if(ishas){
                var c=n-array[i];
                if(array.indexOf(c,i+1)!=-1){
                    list.push([array[i],c]);
                }
            }
        }
        console.log(list);
    }
    Count(info,num); 

在这里插入图片描述

十一、找数组内部缺失值,使得数组值是连续的

    var arr=[1,3,4,7,2,6,9,5];
    var min=Math.min.apply(null,arr);
    var max=Math.max.apply(null,arr);
    for(var i =min;i<=max;i++)
    {
        if(arr.indexOf(i)==-1){
            console.log(i);//8
        }
    } 

十二、数组面试题

题一

    var b=[1,2,3,4];
    var c=b;
    c[0]=10;
    console.log(b);//[10, 2, 3, 4] 
  • 因为数组是引用类型,所以c的值改变,b的值也随之改变。
  • 那么怎么让b的值不改变呢?
  • 使用数组拼接克隆b数组,那么克隆的数组就到了一个新的引用空间,就不会随之改变了。
    var b=[1,2,3,4];
    //克隆b数组
    var h= b.concat();
    var c=h;
    h[0]=10;
    console.log(b);// [1, 2, 3, 4] 

题二

  • 已知后端返回一个对象数组,格式类似这样:
    const arr = [
    { id: 1, name: ‘a’, birth: 896630400000 },
    { id: 2, name: ‘b’, birth: 725817600000 },
    …,
    ]
  • 按要求写代码:
  • 按照 name 属性降序排序(字母顺序从大到小)
  • 去除 id 属性相同的元素(如出现重复,后出现的覆盖先出现的,不要求保留原始顺序)
  • 过滤出所有的95后(birth >= 1995年1月1日)
    var arr = [
        {id: 1, name: 'a', birth: 896630400000},
        {id: 2, name: 'b', birth: 788889700000},
        {id: 3, name: 'c', birth:778789600000},
        {id: 2, name: 'd', birth: 715817600000},
        {id: 2, name: 'e', birth: 725817600000},
        {id: 3, name: 'f', birth: 722817600000},
        {id: 4, name: 'g', birth: 725817600000},
        {id: 5, name: 'h', birth: 625817600000},
        {id: 5, name: 'ab', birth: 685817600000},
        {id: 6, name: 'bc', birth: 775817600000},
        {id: 5, name: 'am', birth: 825817600000},
        {id: 7, name: 'am', birth: 825817600000},
        {id: 8, name: 'am', birth: 825817600000},
        {id: 9, name: 'am', birth: 825817600000}
    ]
    //字母比较大小
    console.log("a" < "b");//true
    console.log("a" < "a");//false
    console.log("a" < "ab");//true
    console.log("ab" < "ac");//true
    console.log("abc" < "b");//true

    arr.sort(function(a1,a2){
        if(a1.name>a2.name){
            return -1;
        }
        else{
            return 1;
        }
    })
    //进行遍历
    var list=[];
    for(var i=0;i<arr.length;i++){
        var index=list.indexOf(arr[i].id);
        if(index==-1){
            list.push(arr[i].id);
        }
        else{
            arr[index]=arr[i];
            arr.splice(i,1);
            i--;
        }
    }
    console.log(arr);

    //对整个数据过滤大于1995年1月1日00:00:00
    //求出这个时间的总毫秒数
    var time=new Date("1995/1/1 00:00:00");
    var time95=time.getTime();
    console.log(time95);
    console.log(arr.filter(function (item) {
        return item.birth > time95;
    })); 

题三

  • 有两个数组,数组a是有序的,数组b是乱序的,把b插入a中,插入后的新数组仍然是有序的,怎么样更高效?
    var u=[1,2,3,4,5];
    var h=[1,3,5,2,4,7,6];
    u= u.concat(h).sort();
    console.log(u);//[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7] 
这篇关于js数组的相关算法题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!