zoukankan      html  css  js  c++  java
  • 前端常见算法题

    1. ['1', '2', '3'].map( parseInt );     //知识点:map和parseInt的使用

      map支持两个参数: 1.回调函数callback  2.用于回调函数中this的值(如果不传默认是undefine).   其回调函数默认接受三个参数(val, index, arr),即(当前遍历的value, 当前遍历的索引值, 当前遍历的数组)。

      parseInt函数支持两个参数,1.要解析的字符串,  2. 要解析的数字的基数,该值介于 2 ~ 36 之间。

    如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

    如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

    所以,遍历的过程实际上是: 

    //step1: parseInt(1, 0)    1
    //step2: parseInt(2, 1) NaN(第二个参数小于2)
    //step3: parseInt(3, 2) NaN(第二个参数是二进制,但是二进制不能解析‘3’,所以是NaN)

    2.统计一段字符串中每个字符出现的次数 ?   //知识点: map(), 对象的合理使用

    参考代码:

       let str = 'xiaoqingxulala';
        let strTimes = {};
        str.split('').map(function (p1, p2, p3) {
            if(!strTimes[p1]) {
                result[p1] = 1;
            }else {
                strTimes[p1] += 1;
            }
        });
        console.log(strTimes)

    升级版: 找出一段字符串中出现次数最多的字符和次数?  //知识点:for...in...

    参考代码:

       //上面已经统计出每个字符出现的次数的对象strTimes:{x: 2, i: 2, a: 3, o: 1, q: 1, …}
       let maxNum = 0; let maxStr = ''; for(let i in strTimes) { if(strTimes[i] > maxNum){ maxNum = strTimes[i]; maxStr = i; } } console.log(maxStr+':'+maxNum)

    弄懂思路以后,转为高级一点的写法就是:

    const str = 'sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha';
    const res = str.split('').reduce((accumulator, cur) => {accumulator[cur] ? accumulator[cur]++ : accumulator[cur] = 1; return accumulator;}, {});

    3.对整型数组进行排序.

    大家可能首先想到的是数组自带的sort方法,但是事实证明这个是有问题的,如下:

    var arr = [2,3,4,2,5,6,8,61];
    console.log(arr.sort());      //[2, 2, 3, 4, 5, 6, 61, 8]

    为什么结果会不对呢,因为sort方法不是严格按照数值的大小进行排序的,而是根据元素的字符编码,所以会出现上述结果.   so,可以用sort()对字符串数组进行排序,如:

    ['abc', 'ccd', 'ced','eaa'].sort();

    回到原题上来,如何正确实现整型数字的排序,只需要添加一个函数:
    var arr = [2,3,4,23,5,6,8,61];
    
    function sortNumber(a, b) {
        return a-b;
    }
    console.log(arr.sort(sortNumber))

     4. 超大数值(超过MAX_SAFE_INTEGER)相加 

    function sumBigNumber(a, b) {
        let res = '',
          temp = 0;
        a = a.toString().split('');
        b = b.toString().split('');
        while (a.length || b.length || temp) {
          temp += parseInt(a.pop()) + parseInt(b.pop());
          res = (temp % 10) + res;
          temp = temp > 9;
        }
        return res.replace(/^0+/, '');
      }
  • 相关阅读:
    南京师范大学2021年高等代数考研试卷
    有限阶全图边图两种颜色后同色三角形数量最少为?(2019年清华大学丘成桐数学英才班)
    关于三个变元的正整数解(2019年清华大学丘成桐数学英才班)
    [Oracle工程师手记]归档日志产生量太大时的简易分析手段
    [Oracle 工程师手记] 如何查看 FRA 的使用率
    [Oracle数据库工程师手记] Data Guard broker 与 ORA-32701
    [Oracle工程师手记]CRSD 进程与 password 文件
    [oracle 工程师手记]RMAN duplicate 发生ORA-19504、ORA-17502、ORA-15001、ORA-27140 错误的解决过程
    [Oracle工程师手记] 备份恢复双城记(三)
    [Oracle工程师手记] 备份恢复双城记(二)
  • 原文地址:https://www.cnblogs.com/qilj/p/7693609.html
Copyright © 2011-2022 走看看