手写题记录

52 阅读1分钟
/**
 * 经过函数fun1的处理,过滤掉所有type=t1的节点及其子节点。
 * let results = {
 *  "data":[
 *    {
 *      "name":"name1",
 *      "type":"t1"
 *    },
 *    {
 *      "name":"name2",
 *      "type":"t2",
 *      "children":[
 *        {
 *          "name":"name3",
 *        "type":"t4",
 *        "children":[
 *          {
 *            "name":"name3",
 *            "type":"t5"
 *          },
 *        ]
 *      },
 *      {
 *        "name":"name4",
 *         "type":"t1",
 *         "children":[
 *           {
 *             "name":"n6",
 *             "type":"t2"
 *           }
 *         ]
 *       }
 *     ]
 *   },
 *   {
 *     "name":"name5",
 *     "type":"t3"
 *   }
 *  ]
 * }
 * 
 * output:[
 *   {
 *     "name":"name2",
 *     "type":"t2",
 *     "children":[
 *       {
 *         "name":"name3",
 *         "type":"t3"
 *       }
 *     ]
 *   },
 *   {
 *       "name":"name5",
 *       "type":"t3"
 *   }
 * ]
 */
 
const filterType = (data) => {
  const dataList = []
  data.forEach(item => {
    if (item.children) {
      item.children = filterType(item.children)
    }
    if (item.type !== 't1') dataList.push(item)
  })
  return dataList
}
console.log(filterType(results.data), 'filterType----')

/**
 * 《次数排序》
 * 根据数组中数字重复出现的次数从小到大排序
 *
 * eg1
 * input: [1,3,4,4,1,1]
 * output: [3,4,4,1,1,1]
 *
 * eg2
 * input: [4, 4, 1, 1, 3, 1, 5, 5, 5, 2, 2, 5, 2, 2]
 * output: [3, 4, 4, 1, 1, 1, 2, 2, 2, 2, 5, 5, 5, 5]
 */

function solution(arr) {
  let map = new Map()
  arr.forEach(item => map.set(item, map.has(item) ? map.get(item) + 1 : 1))
  let mapArr = []
  map.forEach((value, key) => {
    mapArr.push({
      value,
      key
    })
  })
  mapArr = mapArr.sort((a, b) => a.value - b.value)
  const resultArr = []
  mapArr.forEach(item => {
    for (let i = 0; i < item.value; i++) {
      resultArr.push(item.key);
    }
  })
  return resultArr
}
console.log(solution([1,3,4,4,1,1]), '========')

/**  列表转成树形结构
 * let arr = [
 *   { id: '01', name: '张大大', pid: '', job: '项目经理' },
 *   { id: '02', name: '小亮', pid: '01', job: '产品leader' },
 *   { id: '03', name: '小美', pid: '01', job: 'UIleader' },
 *   { id: '04', name: '老马', pid: '01', job: '技术leader' },
 *   { id: '05', name: '老王', pid: '01', job: '测试leader' },
 *   { id: '06', name: '老李', pid: '01', job: '运维leader' },
 *   { id: '07', name: '小丽', pid: '02', job: '产品经理' },
 *   { id: '08', name: '大光', pid: '02', job: '产品经理' },
 *   { id: '09', name: '小高', pid: '03', job: 'UI设计师' },
 *   { id: '10', name: '小刘', pid: '04', job: '前端工程师' },
 *   { id: '11', name: '小华', pid: '04', job: '后端工程师' },
 *   { id: '12', name: '小李', pid: '04', job: '后端工程师' },
 *   { id: '13', name: '小赵', pid: '05', job: '测试工程师' },
 *   { id: '14', name: '小强', pid: '05', job: '测试工程师' },
 *   { id: '15', name: '小涛', pid: '06', job: '运维工程师' }
 * ]
 */

const get_tree = (arr) => {
  const map = {}
  const newArr = []
  arr.forEach(item => {
    map[item.id] = item
  })
  arr.forEach(i => {
    const parent = map[i.pid]
    if (parent) {
      // parent.children ? parent.children.push(i) : parent.children = []
      (parent.children || (parent.children = [])).push(i)
    } else {
      newArr.push(i)
    }
  })
  return newArr
}
console.log(get_tree(arr), 'get_tree-----')

/**
 * 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
 * 示例 1:
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

 * 示例 2:
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
 */

const lengthOfLongestSubstring = function (str) {
    if (!str) return 0;
    let left = 0; let right = 1; let max = 1;
    // 1 < 5
    while (right < str.length) {
      // substr = a ab 1
      const substr = str.slice(left, right);
      // 如果下一个字符在substr已经存在,移动指针,重新寻找子串
      // a includes b
      if (substr.includes(str[right])) {
        left = right;
      } else {
        max = Math.max(max, substr.length + 1);
      }
      right++;
    }
    return max;
  };
  console.log(lengthOfLongestSubstring("abcabcbb"))