面试题整理,人手不足要批量面试些外包人员.整理一些题出来

1.先聊聊都做了什么项目,负责了什么内容的开发,开发了什么组件,什么模块,什么功能.根据简历聊.

  • 遇到过什么难题?
  • 怎么解决的?

恶趣味。为什么0.1+0.2不等于0.3.。。。。PS:十进制整数转二进制方法:除2取余;十进制小数转二进制方法:乘2除整。0.1的二进制是二进制无限循环小数。bignumber.js

//基础知识

2.谈谈过去开发中的代码规范,自由发挥,主要是对项目,对JS,CSS,结构的规范.如何使代码清晰,易维护

-驼峰命名,class,变量,类名,代码复用

-html,css,js,vue相关的.Eslint,

组件封装

谈谈IE兼容问题.如果说不上来就先跳过.

继续阅读“面试题整理,人手不足要批量面试些外包人员.整理一些题出来”

算法记录,每日一题_两数相加02

其实这个应该是链表直接加就行了。。我开始想错了,然后搞笑的玩意来了。把我给气笑了。

测试用例有个

[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] [5,6,4]

JS存的表示为

对于过长的数字,JS显示为1E+30.。。。牛逼。

function sumStrings(a,b){
  var res='', c=0;
  a = a.split('');
  b = b.split('');
  while (a.length || b.length || c){
      c += ~~a.pop() + ~~b.pop();
      res = c % 10 + res;
      c = c>9;
  }
  return res.replace(/^0+/,'');
 
}

https://www.jianshu.com/p/c373943f0e9e js大数相加问题

JS处理大数相加,一般引用BigNumber.js。。查了下核心代码,加法的计算如下。

 // adds two positive BigNumbers
    BigNumber._add = function(a, b) {
        var index;
        var remainder = 0;
        var length = Math.max(a.number.length, b.number.length);

        for (index = 0; index < length || remainder > 0; index++) {
            a.number[index] = (remainder += (a.number[index] || 0) + (b.number[index] || 0)) % 10;
            remainder = Math.floor(remainder / 10);
        }

        return a.number;
    };

a.number = [],是个数组 array : [3,2,1], [‘+’,3,2,1], [‘-‘,3,2,1]。所以说,我存储的结构必须改变为数组。

原来的思路PASS。

完成版本。。。效率惨不忍睹。

执行结果:

通过
执行用时 :232 ms, 在所有 JavaScript 提交中击败了5.21%的用户
内存消耗 :44.5 MB, 在所有 JavaScript 提交中击败了8.82%的用户
随后我去掉了,console.log
执行用时 :132 ms, 在所有 JavaScript 提交中击败了70.70%的用户
内存消耗 :39.3 MB, 在所有 JavaScript 提交中击败了27.94%的用户
提升了一倍的速度。问题是怎么降低内存开销。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    var numListA = [];
    var numListB = [];
    var resultArr = [];
    getListNodeArr(numListA,l1);
    getListNodeArr(numListB,l2);
    console.log(numListA)
    resultArr = add(numListA,numListB)
    console.log(resultArr)
    return array2ListNode(resultArr)

    function array2ListNode(arr){
        var line = arr.map((i,j)=>{
            return new ListNode(i)   
        })
        for(var j = 0;j<= line.length; j++){
            line[j+1] && (line[j].next = line[j+1])
        }
        return line[0]
    }
    function getListNodeArr(listArr,listNode){
        if(listNode.next!=null){
            listArr.push(listNode.val)
            getListNodeArr(listArr,listNode.next)
        }else{
            listArr.push(listNode.val)
        }
    }
    function add(listA,listB){
        var index;
        var remainder = 0;
        var length = Math.max(listA.length, listB.length);

        for (index = 0; index < length || remainder > 0; index++) {
            listA[index] = (remainder += (listA[index] || 0) + (listB[index] || 0)) % 10;
            remainder = Math.floor(remainder / 10);
        }
        return listA;
    }
};

 

好吧,看了官方解法。

很简单,逆序保证了,低位对齐。然后进一位,记录.

var addTwoNumbers = function(l1, l2) {
    var result = temp = new ListNode(0)
    while(l1 || l2){
        var sum = (l1 && l1.val || 0) + (l2 && l2.val || 0) + ( temp.val || 0 )
        var carry = parseInt(sum / 10)
        l1 = l1 && l1.next
        l2 = l2 && l2.next
        temp.val = (sum % 10)
        if(l1 || l2 ||carry){
            temp.next = new ListNode(carry)
        }
        temp = temp.next
    }
    return result
};

貌似标准答案也没有快很多,空间占用也挺多的.

气死个人。。一晚上,没什么提速。感觉leetcode有问题。

C语言真的强。。算法是一样的。

惊了,java只要2ms,wtf