zoukankan      html  css  js  c++  java
  • JS算法问题记录——长期更新

    算法很重要!即使前端也不例外!

    这不是一篇洗脑文,仅以此篇随笔来记录遇到过的与前端有关的算法问题。当然了,作为一枚小白,涉及到的问题可能都偏于简单。这篇随笔长期更新~以督促自己!

    1.数组去重问题

    详细请看此文

    数组去重算是一道比较经典的算法问题了。输入一个数组,输出的数组中要求不能有重复数据项。

    方法一(顺序输出,兼容不佳)

    思路:使用JS中Array所提供的indexOf方法来匹配是否含有该数组项,若无则添加到临时变量去。如此反复,返回新数组。(此方法每次返回的都是遇到的第一个重复项,例如数组[10,2,2,1,3,10],返回[10,2,1,3])。此方法不适用于IE9以下的浏览器(indexOf方法的兼容问题)。

    function unique(arr){
        //用来存储结果
        var newArr = [];
        //遍历newArr数组中是否含有某数据项,若无,增添该项
        for(var i=0,len=arr.length;i<len;i++){
            if(newArr.indexOf(arr[i]) == -1){
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    

    方法二 (倒叙输出,兼容佳)

    当然了,方法一不适用于低版本的浏览器,为了兼容所有的浏览器,还有其他的方法,在此列出一种。这个方法数组的结果是倒叙,例如例如数组[10,2,2,1,3,10],返回[2,1,3,10]),即按照最后一次出现的项排序输出。

    思路:

    1. 有两个哨兵(指针,暂名为i和j),每次哨兵i要和除了哨兵i以外的所有项去比较是否相等,由哨兵j来控制数据项。
    2. 如若遇见相等的数据项,哨兵i就往前移动一个位置(有点舍弃这个项的意思),直到哨兵j移动到最后一个位置,将没有重复的项即哨兵i所在的位置的项放到新数组中去。
    3. 如此反复。
    function unique2(arr){
        var newArr = [];
        for(var i=0,len=arr.length;i<len;i++){
            for(var j=i+1;j<len;j++){
                if(arr[i] == arr[j]){
                    ++i;
                }
            }
            newArr.push(arr[i]);
        }
        return newArr;
    }
    

    2.怪异计算

    前段时间投了网易的前端岗,遇到一个题目,题目大意为:在正常的运算中是先乘除后加减,但是现在存在一种怪异的运算,是按顺序计算的。例如2+3*4,正常的运算是先算出2+(3*4),但是怪异计算是(2+3)*4。(所有的数字范围在0-9之间)最后输出运算的结果。

    由于js数据是弱类型且是按值传递的,所以存在传值问题,直接传递式子会导致函数获取到的是结果。所以传参只能使用字符串形式传参。目前没有想到好的解决方案。(有思路了之后再更新)

    思路:正则拆分字符串,符号为一组,数字为一组。

    function calc(str){
        
        // 匹配字符串是否为式子
        if(!(/^([0-9](+|-|*|/))+([0-9]$)/g).test()){
            console.log("wrong enter");
            return;
        }
        
        //匹配出运算符
        var num = str.match(/(*|+|-|/)/g);
        //匹配出数字
        var tag = str.match(/[0-9]/g);
        
        var result = num[0];
        for(var i=0,len=tag.length;i<len;i++){
            switch(tag[i]){
                case '+':
                    result += num[i+1];
                    break;
                case '-':
                    result -= num[i+1];
                    break;
                case '*':
                    result *= num[i+1];
                    break;
                case '/':
                    result /= num[i+1];
                    break;
            }
        }
        console.log(result);
    }
    
    
  • 相关阅读:
    android handle详解
    android面试详解
    linux网络编程-一个简单的线程池(41)
    linux网络编程-posix条件变量(40)
    如何写一个简单的分页
    jQuery 3 有哪些新东西
    浅析正则表达式模式匹配的 String 方法
    jQuery源码浅析2–奇技淫巧
    前端文本截断
    你会用setTimeout吗
  • 原文地址:https://www.cnblogs.com/adelina-blog/p/6624109.html
Copyright © 2011-2022 走看看