美文网首页
前端有难度的算法题

前端有难度的算法题

作者: 空无一码 | 来源:发表于2020-08-21 16:18 被阅读0次

将对象数组转为树状对象

// 输入

const industry_list = [
  {
  "parent_ind" : "女装",
  "name" : "连衣裙"
  },
  {
  "name": "女装"
  },
  {
  "parent_ind" : "女装",
  "name" : "半身裙"
  },
  {
  "name": "数码"
  },
  {
  "parent_ind" : "数码",
  "name": "电脑配件"
  },
  {
  "parent_ind" : "电脑配件",
  "name": "内存"
  },
  {
    "parent_ind" : "内存",
    "name": "你懂得"
  },
];

// 期待输出

{
  "女装": {
    "连衣裙": {}
    "半身裙": {}
   },
  "数码": {
    "电脑配件": {
      "内存": {}
    },
  },
}

// 代码实现

function convert_format(data) {
    if (!Array.isArray(data)) {
      return '请输入对象数组';
    }
    const flagObj = {};
    const resData = {};
    const parents = [], children = [];
    let parent = null, child = null;
    let parentKey = null, childKey = null;
    // 先把原数组拆分成两个数组,其中一个数组只有一级节点
    for(let item of data) {
      if (item.parent_ind) {
        children.push(item);
      } else {
        parents.push(item);
      }
    }
    // 当两个数组都为空时结束循环
    while(parents.length || children.length) {
      if(parents.length) {
        // 先一次处理一级节点
        parent = parents.shift();
        parentKey = parent.name;
        resData[parentKey] = {};
        // 保留其指向的引用地址
        flagObj[parentKey] = resData[parentKey];
      } else {
        child = children.shift();
        childKey = child.name;
        if(child.parent_ind in flagObj) {
          // 如果当前节点的父节点如果已经存在,则把该节点插入进入
          flagObj[child.parent_ind][childKey] = {};
          // 保留其指向的引用地址
          flagObj[childKey] = flagObj[child.parent_ind][childKey];
        } else {
          // 否则先放回数组
          children.push(child)
        }
      }
    }

    return resData;
}

console.log('结果', convert_format(industry_list));

树状对象按照层级转为二维数组

// 输入

const obj = {
  a: {
    b: {
      c: {
        d: null
      },
      f: {
        e: null
      }
    }
  },
  g: {
    h: {
      i: null
    }
  },
  j: '222'
}

// 期待输出

[["a", "g", "j"], ["b", "h"], ["c", "f", "i"], ["d", "e"]]

// 代码实现

function isComObj(obj) {
  return obj !== null && typeof obj === 'object' && !(obj instanceof Array);
}

function flatObjKey(obj) {
  const resArr = [];
  let itemArr=[], curArr=[], nextArr=[];
  for (key in obj) {
    itemArr.push(key);
    if (isComObj(obj[key])) {
      curArr.push(obj[key]);
    }
  }
  resArr.push(itemArr);
  itemArr = [];
  let item = null;
  while (curArr.length > 0) {
    item = curArr.shift();
    for (key in item) {
      itemArr.push(key);
      if (isComObj(item[key])) {
        nextArr.push(item[key]);
      }
    }
    if (curArr.length === 0) {
      resArr.push(itemArr);
      itemArr = [];
      curArr = nextArr;
      nextArr = [];
    }
  }
  return resArr;
}

console.log('ddd', flatObjKey(obj));

求连续 1 的个数

const data = [
[1, 0, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0]
];

function mergeArr(arr, i, j, m, n) {
if (i < 0 || i>= m || j <0 || j >= n || arr[i][j] !== 1) {
return;
}
arr[i][j] = -1;
mergeArr(arr, i-1, j, m, n);
mergeArr(arr, i+1, j, m, n);
mergeArr(arr, i, j-1, m, n);
mergeArr(arr, i, j+1, m, n);
}

const getCounts = (arr) => {
// return 0;
const m = arr.length, n = arr[0].length;
let count = 0;

for (let i= 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
        if (arr[i][j] === 1) {
            count++;
            mergeArr(arr, i, j, m, n);
        }
    }
}

return count;

}

console.log(getCounts(data))

相关文章

  • 前端有难度的算法题

    将对象数组转为树状对象 // 输入 // 期待输出 // 代码实现 树状对象按照层级转为二维数组 // 输入 //...

  • 8.12网易前端笔试感想(编程部分)

    今天下午参加了网易前端笔试,选择题考了算法,数据结构还有JS有关知识,题目难度相对基础,算是很幸运的,编程题三道,...

  • 找出数组中第 k 大的数字及其出现次数

    这是前端面试过程中遇到的一道算法题,虽说难度不大,但是也有些细节的地方需要仔细考虑。 比如说数组 [1, 2, 4...

  • LeetCode:最长回文子串

    About 我感觉这道题应该是比较经典的题了,甚至有专门解此题的算法,虽然这是一道中等难度的题,但是该题却困扰了我...

  • 写给iOS开发的跳一跳秘籍

    开篇前说一下上周和这周都没更新算法题。因为这两周的算法题难度级别都是'Hard',经典题N皇后问题,网上太多太多了...

  • 前端要掌握的几种排序算法

    因为之前面试有问到快排,昨天笔试又有做到关于排序算法的题,所以特地看了一下关于排序算法。前端对算法的要求不高,但是...

  • 前端算法题收集

    数组去重和排序的多种实现算法 数组扁平化的N种实现方案 阿里面试题之斐波那契数列 字节跳动经典算法题

  • 前端手写算法题

    1、深拷贝deepCopy 2、对象扁平化 3、数组扁平化 4、手写Promise 5、promise.all方法...

  • ZOJ Problem Set - 1001&1002&

    开始前的话 今天微软笔试难度直接把我吓蒙了··· 之前的腾讯网易笔试这些都还好,算法题能写出来,微软的4个算法题,...

  • 【西瓜哥说算法】从前序与中序遍历序列构造二叉树

    大家好,我是前端西瓜哥。今天我们来讲一道有点难度的二叉树算法题:从前序与中序遍历序列构造二叉树。 给定两个整数数组...

网友评论

      本文标题:前端有难度的算法题

      本文链接:https://www.haomeiwen.com/subject/qaoujktx.html