依图科技面试

依图科技面试记录

依图科技是我第一个走完所有流程的公司,虽然不知道offer最终会发下来与否。但是终于有公司让我走完了流程,对我有一点肯定。感谢依图科技!
最近几天有空。记录一下自己觉得有趣的吧。

一面

一面时电话面试,上来就是自我介绍。
比较队列和栈
用两个栈实现队列的入队出队操作
给定一个数组,里面有若干个1和若干个2,现在需要将所有的1放到数组左边,所有的2放到数组右边,时间复杂度O(n),空间复杂度O(1)。请实现这个排序算法。
这个问题我用到了快排 说到快排 我之前用的是一个错误的快排。我知道它的思想但是实现的方式增加了空间复杂度而且不停地重新分配数组。这是对性能很大的损耗。也就是网上抨击阮一峰老师的那个快排了,说起阮一峰老师,说真的很感谢他。看了一些他的博客收获很大,虽然他这个快排有错误。但是我觉得思想是在那里正确的,指出错误就行,非得抨击?
二面中又问到了快排

function quickSort (arr) {
  if (arr.length === 1) {
    return arr;
  }
  let change = function (arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
  let partition = function (arr, left, right) {
    let temp = arr[left],
      i = left,
      j = right + 1;
    while(true){
      while(arr[--j]>temp) {
        if (j === left)
          break;
      }
      while(arr[++i]<temp){
        if(i === right)
          break;
      }
      if(i >= j)// 这一步必须放在前面 避免错误的交换
        break;
      change(arr,i,j);
    }
    change(arr,left,j);
    return j;
  }
  let quick = function (arr,left,right) {
    if(left>right){
      return;
    }
    let j = partition(arr,left,right);
    quick(arr,left,j-1);
    quick(arr,j+1,right);
  }
  quick(arr,0,arr.length-1);
}

感觉问的问题有的有点零碎…

二面

我对于闭包的理解?
在我的理解中,闭包就是利用了JS的作用域链,函数嵌套函数,缓存了一个变量。
在这里我扩充一下。JS是静态的作用链。

// 闭包
    for(var i = 0;i < 10;i++){
        (function(i){
            aBtn[i].onclick=function(){
                console.log(i);
            }
        })(i);
    }
// 静态作用域
    var x = 1;
    function a(){
        console.log(x)
    }
    function b(){
        var x = 2;
        a();// 1
    }

深拷贝
相信大家一定都会。但是二面的面试官让我考虑字符型,数字型。
我的第一版

function deepCopy(o,c){
  var c = c || {}
  for(var i in o){
    if(typeof o[i] === 'object'){
      //要考虑深复制问题了
      if(o[i].constructor === Array){
        //这是数组
        c[i] =[]
      }else{
        //这是对象
        c[i] = {}
      }
      deepCopy(o[i],c[i])
    }else{
      c[i] = o[i]
    }
  }
  return c
}

似乎没什么不对,但是代码需要考虑鲁棒性。当我们的o为对象时肯定没问题的//{}
但是数组,字符串,数字呢。所以我们需要重新考虑,完善一下这个深拷贝

function deepCopy(target,data){
  switch (typeof data){
    case 'number':
      target = data;
      break;
    case 'string':
      target = data;
      break;
    case 'object':
      if(Array.isArray(data)){
        target = [];
        for(var i =0;i<data.length;i++){
          target[i]=deepCopy(target[i],data[i]);// 注意这里需要接收结果
        }
      }else{
        target = {};
        for(var i in data){
          if(data.hasOwnProperty(i)){// 这里看自己的需求吧 是否遍历对象原型上的属性方法
            target[i]=deepCopy(target[i],data[i]);// 注意这里需要接收结果
          }
        }
      }
  }
  return target;
}

一面后有三题,记得中间那题蛮有意思的

虽说可以暴力破解,但是动态规划的思想还是要有,但是惭愧的是我当时DP没解出来……还是太菜了啊。用的暴力递归。

猜你喜欢

转载自blog.csdn.net/bigbigpotato1024/article/details/80549920
今日推荐