面试题(8)之 在线题

导言:

  前几天约了一家外包到百度公司的面试;今天下午接到hr小姐姐的电话,说是先在线做题,那就约好了晚上做题,下班回去就开始做题了,2道题,做了将近一个半小时,哎。

  特此记录了一下

面试题一

面试题(8)之 在线题_第1张图片

 链表

数组不总是组织数据的最佳数据结构。原因如下:

在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,在要加入新的元素就会非常困难。

在数组中,添加和删除元素也是很难麻烦的,因为需要将数组中的其他元素向前或向后平移,以反映数组刚刚进行了添加或删除的操作。

然而,JavaScript 的数组并不存在上述问题,因为使用split()方法不需要要在访问数组中的其他元素了。

 

JavaScript中数组的主要问题是,他们被实现成了对象,与其他语言(比如C++ java)的数组相比,效率很低。

 

如果你发现数组在实际使用中很慢时,就可以考虑使用链表来替代它。除了对数组的随机访问,链表几乎可以用在任何可以使用以为数组的情况中。

如果需要需要随机访问,数组任然是更好的选择。

思路-链表的指针变换

链表的题目一般都需要使用一个虚拟的节点来作为中间节点,不停改变指针的值。

 方法一

function reverseLinkedList(head) {
    //  链表的指针变换。
    // 如果 head 或者 head.next 为 null,返回null
    if (head==null || head.next==null){
        return head;
    }
    // pre 记录前驱节点
    var pre = null;
    // 使用 next 指针记录当前节点
    var next = null;
    // 如果 head 不为 null
    while (head != null) {
        // 获取 头结点以后 链表,方便下次遍历
        next = head.next;
        // 将上次的链表投节点 拼接在此次头结点后——翻转节点
        head.next = pre;
        // 获取此次的 链表头结点
        pre = head;
        // 将 头结点以后的链表 赋值给 head,方便下次遍历
        head = next;
    }
    return pre;
}

 

方法二

//法二
function reverseLinkedList(head) {
    if(head==null || head.next==null){
        return head;
    }
    var list = head;
    var p = list;
    var q= null;
    while(p.next!=null) {
        q = p.next;
        p.next = q.next;
        q.next = list;
        list = q;     
    }
    return list;
}

 

面试题二

面试题(8)之 在线题_第2张图片

 

答案:

  let arr = [
    [1, 2, 3],
    [4, 5, 6]
  ]
  function rotateMitrix(mitrix) {
    let m = mitrix.length //
    let n = mitrix[0].length //
    let getArr = []
    let temp = new Array()
    for(let i = 0; i < n; i++) {
      temp[i] = []
      for(let j = 0; j < m; j++) {
        temp[i][j] = mitrix[m - j - 1][i]
      }
      getArr.push(temp[i])
    }
    console.log(getArr)
    return getArr
  }
  rotateMitrix(arr)

面试题(8)之 在线题_第3张图片

 

你可能感兴趣的:(面试题(8)之 在线题)