滴滴前端面經_網約車

編程題

  1. 給定一個字符串“adgeidjdddiggg”刪除出現次數最小的字符,輸出“dgiddddiggg”
    思路:輸入爲字符串,輸出爲字符串情況 => 巧用對象obj={}
function text1(str) {
  let len = str.length
  let obj = {}
  let chart
  // 先轉成對應的對象,統計出現次數{ a: 1, d: 5, g: 4, e: 1, i: 2, j: 1 }
  for (let i = 0; i < len; i++) {
    chart = str.charAt(i) // charAt()字符串方法,返回指定位置上的字符
    if (!obj.hasOwnProperty(chart)) {
      obj[chart] = 1
    } else {
      obj[chart] = ++obj[chart]
    }
  }
  // 找到出現次數最小值min
  let min = obj[chart] 
  for (var key in obj) {
    if (min > obj[key]) {
      min = obj[key]
    }
  }
  // 將原字符串轉成數組,若數組中的字符串爲最小值的key即刪除數組中的字符
  let arr = str.split('')
  for (var kit in obj) {
    if (obj[kit] === min) {
      for (let j = 0; j < arr.length; j++) {
        if (arr[j] == kit) {
          arr.splice(j, 1)
        }
      }
    }
  }
  // 將數組轉爲字符串輸出
  let newStr = arr.join('') 
  return newStr
}
var str = 'adgeidjdddiggg'
text1(str)
  1. 一一對應關係,輸入兩個字符串,判斷其是否爲一一對應關係
例如:abce->jkop;滿足一一對應關係
	 abce->jkoc;不滿足條件
忽略:理想條件下輸入的兩個字符串長度相等且均合法
輸入兩個字符串,輸出true/false
// 思路:反向思考,排除一對多的情況(aabced->acqjkl),排除多對一的情況(abcdefg->aajkqom)排除交叉對應(abcd->bcae)
function oneFaceOne(str1, str2) {
  let obj1 = {}
  let obj2 = {}
  // 排除一對多的情況
  for (var i = 0; i < str1.length; i++) {
    let chart1 = str1.charAt(i)
    let chart2 = str2.charAt(i)
    if (obj1.hasOwnProperty(chart1) && obj1[chart1] != chart2) {
      return false
    } else {
      obj1[chart1] = chart2
    }
  }
  // 排除多對一的情況
  for (var j = 0; j < str2.length; j++) {
    let chart1 = str1.charAt(j)
    let chart2 = str2.charAt(j)
    if (obj2.hasOwnProperty(chart2) && obj2[chart2] != chart1) {
      return false
    } else {
      obj2[chart2] = chart1
    }
  }
  // 排除交叉對應
  for (var key in obj1) {
    for (var kit in obj2) {
      if (key === kit && obj1[key] !== obj2[kit]) {
        return false
      }
    }
  }
  return true
}
  1. 給定一個字符串“adgeidjdddiggg”輸出“d出現的次數最多,最多5次”(與第一題相似)

  2. 導航欄查詢,本質:嵌套數組的遍歷查找,類似於二叉樹的查找
    二叉樹遍歷方式
    在這裏插入圖片描述
    前序遍歷:abdefgc
    中序遍歷:debgfac
    後序遍歷:edgfbca

輸入:obj 111
arr = [{
  name: 'add',
  id: 1,
  child: [
    {
      name: 'age',
      id: 11,
      child: [
        {
          name: 'end',
          id: 111
        }
      ]
    },
    {
      name: 'like',
      id: 12,
      child: [
        {
          name: 'secend',
          id: 121
        }
      ]
    }
  ]
}
// ...可以有多個對象
]
輸出:["add","age","end",111]
function oneFaceOne(arr, num) {
  let result = []
  let toArr = function(arr, num) {
    for (var i = 0; i < arr.length; i++) {
      if (i > 0) {
        result.pop()
      }
      if (arr[i].child) {
        result.push(arr[i].name)
        toArr(arr[i].child, num)
      } else if (arr[i].id == num) {
        result.push(arr[i].name)
        result.push(arr[i].id)
        return result
      }
    }
  }
  toArr(arr, num)
  return result
}
  1. 數組降維(會做第四題的前提)
    5.1 數組中無對象的情況,arr = [1,2,3[4,4,5],[3,4],[13,[4,66,6],7],“end”]
    讓數組和字符串相加,數組會調用toString()方法,先轉化成字符串,隨即執行加運算符
    加號+運算符詳情
// 可以直接使用數組處理方法split()
function arrayDrop(arr) {
  let result = '' + arr //1,2,3,84,49,5,13,74,13,4,66,6,7,end
  result = result.split(',')
  console.log(result)
}

5.2 數組中存在對象的情況arr = [1, 2, 3, [84, 49, 5], [13, 74], [13, [4, 66, 6], 7], {name:“miaomiao”,age:2},“end”]

function arrayDrop(arr) {
  let result = []
  let toArr = function(arr) {
    arr.forEach(item => {
      item instanceof Array ? toArr(item) : result.push(item)
    })
  }
  toArr(arr)
  return result
}

框架題

  1. 發佈訂閱

  2. React最新版本特性

  3. redux

  4. HOC高階函數

  5. 組件間的通信有哪幾種方式(是通信方法有那幾種ref)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章