写点什么

我在近期求职中遇到的前端面试问题及其解法

2020 年 9 月 08 日

我在近期求职中遇到的前端面试问题及其解法

在今天的文章中,我想跟大家聊聊自己最近在 COVID-19 疫情下的求职经历中遇到的问题。另外,我还把自己的准备工作整理成一份资源清单供大家参考。


这些问题主要分为以下几个小节。


  • JS

  • 编码

  • 应用题

  • 杂项


这里提出的解法并不能直接使用,只代表我个人的思维方式与粗略概念。大家不妨尝试用自己的办法解决这些问题。


JS


1) 给定一个深度为 n 的多维数组,将其展平。展平后,将其作为 array 实例上的可用方法。


解:


/*** [1,2,[3,4]] -> [1,2,3,4]*/
let arr = [1,2,[3,4, [5,6, [7, [8, 9, 10]]]]]
function flatten(arr) { return arr.reduce(function(acc, next){ let isArray = Array.isArray(next) return acc.concat(isArray ? flatten(next) : next) }, [])}
if (!Array.prototype.flatten) { Array.prototype.flatten = function() { return flatten(this) }}console.log(arr.flatten());
复制代码


2) 从零开始创建一项 promise。


解:


class CustomPromise {  state = "PENDING"  value = undefined  thenCallbacks = []  errorCallbacks = []
constructor(action) { action(this.resolver.bind(this), this.reject.bind(this)) }
resolver(value) { this.state = "RESOLVED" this.value = value this.thenCallbacks.forEach((callback) => { callback(this.value) }) }
reject(value) { this.state = "REJECTED" this.value = value this.errorCallbacks.forEach((callback) => { callback(this.value) }) }
then(callback) { this.thenCallbacks.push(callback) return this }
catch (callback) { this.errorCallbacks.push(callback) return this }}
let promise = new CustomPromise((resolver, reject) => { setTimeout(() => { const rand = Math.ceil(Math.random(1 * 1 + 6) * 6) if (rand > 2) { resolver("Success") } else { reject("Error") } }, 1000)})
promise .then(function(response){ console.log(response) }) .catch(function(error){ console.log(error) })
复制代码


3) 按平均评分及名称对电影列表进行过滤。按电影对象内的任意字段对过滤后的列表进行排序。


解:


// O(M)function getMovies() {  return []; // [{id, name, year}]}
// O(R)function getRatings() { return []; // [{id, movie_id, rating}] 0 <= rating <= 10 // e.g 9.3}
/** * minAvgRating -> * avgRating >= minAvgRating * * sort -> * name -> ascending order movies by name * -name -> descending * * avgRating * * * search -> * 'ave' -> 'Avengers' * 'avengers' -> 'Avengers' * 'AvengersInfinitywar' -> 'Avengers' */const toLower = str => str.toLocaleLowerCase()
const getAvrgRating = (movie, movingWithRatings) => { let count = 0; return movingWithRatings.reduce((acc, value, index) => { const movieMatch = movie.id === value.movie_id if (movieMatch) { acc+=value.rating count++ } if (index === movingWithRatings.length - 1) { acc = acc/count } return acc }, 0)}
const isSubString = (str1, str2) => { str1 = toLower(str1.split(" ").join("")) str2 = toLower(str2.split(" ").join("")) if (str1.length > str2.length) { return str1.startWith(str2) } else { return str2.startWith(str1) }}
const moviesList = getMovies()const movingWithRatings = getRatings();function queryMovies({ search, sort, minAvgRating }) { let filteredMovies = movingWithRatings.filter(movie => getAvrgRating(movie, movingWithRatings) >= minAvgRating); filteredMovies = filteredMovies.map(movie => moviesList.filter(listItem => listItem.id === movie.movie_id).pop()) filteredMovies = filteredMovies.filter(movie => isSubString(toLower(movie.name), toLower(search))) filteredMovies = filteredMovies.sort((a, b) => { const isDescending = sort[0] === '-' ? true : false let sortCopy = isDescending ? sort.slice(1) : sort const value1 = a[sortCopy] const value2 = b[sortCopy] if (isDescending) { return value1 > value2 ? -1 : 1 }else { return value1 < value2 ? -1 : 1 } }) filteredMovies = filteredMovies.map(movie => ({ ...movie, avgRating: movingWithRatings.filter(ratedMovie => ratedMovie.movie_id === movie.id)[0].rating })) return filteredMovies}
复制代码


4) 给定一个用于获取所有 posts 与 comments 的端点 URL。解决以下问题:


将所有评论(comments)映射至其所归属的帖子(posts),映射后的结果数据应具有以下结构。


解:


//service.jsconst POSTS_URL = `https://jsonplaceholder.typicode.com/posts`;const COMMENTS_URL = `https://jsonplaceholder.typicode.com/comments`;
export const fetchAllPosts = () => { return fetch(POSTS_URL).then(res => res.json());};
export const fetchAllComments = () => { return fetch(COMMENTS_URL).then(res => res.json());};

import { fetchAllPosts, fetchAllComments } from "./service";


const fetchData = async () => { const [posts, comments] = await Promise.all([ fetchAllPosts(), fetchAllComments() ]);
const grabAllCommentsForPost = postId => comments.filter(comment => comment.postId === postId);
const mappedPostWithComment = posts.reduce((acc, post) => { const allComments = grabAllCommentsForPost(post.id); acc[post.id] = allComments; return acc; }, {});
console.log("mappedPostWithComment ", mappedPostWithComment);};
fetchData();
复制代码


5) 在字符串实例上实现方法 getHashCode。此方法应适用于所有字符串类型。


解:


let s1 = "sample"
if (!String.prototype.getHashCode) { String.prototype.getHashCode = function(){ console.log('String instance ', this) return this }}
复制代码


6) 以下表达式的计算结果是什么?


1+true    true+true1’+true2’ > ’3    ‘two’>’three’
复制代码


解:


221truefalsetrue
复制代码


7) 实现 bind 与 reduce。


解:


//bindif (!Function.prototype.bind) {  Function.prototype.bind = function(...arg){    const func = this    const context = arg[0]    const params = arg.slice(1)    return function(...innerParam) {      func.apply(context, [...params, ...innerParam])    }  }}
//reduceArray.prototype.reduce = function(func, initState) { const arr = this const callback = func let init = initState
arr.forEach(function(value, index){ init=callback(init, value) }) return init}
复制代码


8) 实现 debounce(防抖)函数。


解:


const debounce = function(func, interval) {  let timerId;  return function(e){    clearTimeout(timerId)    timerId = setTimeout(function(){      func.apply()    }, interval)  }}debounce(apiCall, 3000)
复制代码


9) 实现 throttling(节流)函数。


解:


const throttle = (callback, interval) => {  let timerId;  let allowEvents = true;
return function() { let context = this; let args = arguments;
if (allowEvents) { callback.apply(context, args) allowEvents = false; timerId = setTimeOut(function(){ allowEvents = true }, interval) } }}
复制代码


10) 设计一套 API 轮询机制,以固定时间间隔调用该 API。此 API 属于股票 API,可获取最新股票价格。在提取完毕后,将结果呈现在 UI 当中。


这个问题的解主要偏重设计而非代码,属于典型的开放式问题。


解:


//With setInterval, throttling and flagssetInterval=>Endpoint=>Render
//with the inversion of control//Endpoint=>Render=>setTimeout=>Endpoint=>Render=>SetTimeout...
复制代码


11) 将以下给出的、基于类的继承代码转换为 ES5 代码。


class Parent(name){  constructor(name) {    this.name=name  }
getName(){return this.name}}
class Children extends Parent { constructor(props){ super(props) }}
复制代码


解:


function Parent(name) {  this.name = name}
Parent.prototype.getName = function() { return this.name}
function Children(name){ Parent.call(this, name)}
Children.prototype = new Parent()
复制代码


12) 以下代码的计算结果是什么?


//Q.1var x = 1;var y = x;
x = 0;console.log(x, y);
//Q.2var x = [1];var y = x;
x = [];console.log(x,y);
//Q.3function Abc() { console.log(this); };Abc()new Abc();
//Q.4var x = 1;var obj = { x: 2, getX: function () { return console.log(this.x); }};
obj.getX()let a = obj.getXconsole.log(a)
//Q.5//How to get the a to log 2 in the above code
//Q.6console.log("A");setTimeout(() => console.log("B"), 0);setTimeout(() => console.log("C"), 0);console.log("D");
//Q.7setTimeout(function() { console.log("A");}, 0);Promise.resolve().then(function() { console.log("B");}).then(function() { console.log("C");});
console.log("D");
//Q.8let obj1 = { a:1, b:2}
function mutate(obj) { obj = {a:4, c:6}}
console.log(obj1)mutate(obj1)console.log(obj1)
复制代码


解:


//A.10 1
//A.2[] [1]
//A.3window object is logged
//A.4logs 2 and 1
//A.5a.call(obj);
//A.6A, D, B , C
//A.7D, B, C, A
//A.8{ a: 1, b: 2 }{ a: 1, b: 2 }
复制代码


13) 给定一个数字数组,请执行以下操作:


const list = [1,2,3,4,5,6,7,8]const filteredArray = list.filter(between(3, 6)) // [4,5]
复制代码


解:


function between(start, end) {  return function (value,index) {    return value>start && value<end  }}
复制代码


算法


1) 考虑以下级数:


A := 1B := A*2 + 2C := B*2 + 3 and so on...
复制代码


请编写一款程序,以:


给出与给定字母相对应的数字;


给定一个类似“GREP”的字母字符串,请结合以上级数,计算与该字符串中所有字母相对应的数字之和(即 G+R+E+P);


给定一个较大数(可大至标准 32 位整数),请找到与之对应的最短字母字符串。


您可能会在最后一题中使用贪心算法。请根据实际情况,在必要时计算与字母相对应的数字值,请勿事先进行预计算并将结果存储在数据结构当中。


解:


//A = 1//B = A*2 +2//C = B*2+ 3//D = C*2+ 3
var genCharArray = function(charA, charZ) { var a = [], i = charA.charCodeAt(0), j = charZ.charCodeAt(0); for (; i <= j; ++i) { a.push(String.fromCharCode(i)); } return a;}
var charMap = {};var charArray = genCharArray('a', 'z');
charArray.forEach(function(char, index){ charMap[char] = Number(index + 1);});

var charSequence = function(char){ if(typeof char==="string"){ char = charMap[char]; } if(char==1){ return 1; }else{ return char + 2 * charSequence(char-1); }}
var input = process.argv[2];
if(input.length===1){ console.log(charSequence(charMap[input]));}else if(input.length>1){ var charTotalSequence = input.split("").reduce(function(acc, curr){ return acc + charSequence(charMap[curr]); },0); console.log(charTotalSequence);}
复制代码


2) 给定一个数组,请找到另一结对数组,保证两个数组的加和为特定数。


解:


let nums = [2, 7, 10, 1, 11, 15, 9]let target = 11let numsMap = new Map()let pairs = nums.reduce((acc, num) => {  let numToFind = target - num  if (numsMap.get(numToFind)) {    return [...acc, [num, numToFind]]  } else {    numsMap.set(num, true)    return [...acc]  }}, [])
console.log("Pairs ", pairs)
复制代码


3) 在给定数组中找到局部最大值。所谓局部最大值,是指大于其左右相邻数的元素。这里我给出一个 O(n) 解,无需优化即可简单解决这个问题。


解:


let x = [1, 2, 3, 5, 4] //Outputs: 5if x.length == 1 return x[0]else let i = 1 for(;i<x.length-1;i++){  if x[i-1]<x[i] and x[i] > x[i+1] return x[i] } if x.length - 1 == i return x[i]
复制代码


4) 对某一数组顺时针旋转 90 度,旋转后的数组即为解。


leetcode:


https://leetcode.com/problems/rotate-image/


解:


[ [1, 2, 3], [4, 5, 6], [7, 8, 9]]//The solution is to first take the transpose of the matrix.//After taking the transpose the resulting matrix is as follows.[ [1, 4, 7], [2, 5, 8], [3, 6, 9]]//After the transpose step, All we have to do is to reverse the array @ each entry.//The resulting matrix after after reversal is as follows.[ [7, 4, 1], [8, 5, 2], [9, 6, 3]]//The above matrix is rotated 90 degree
复制代码


5) 对于给定数组,请找到数组中加和等于给定目标的三个元素。


解:


let x = [1, 2, 3, 4, 5]let target = 7let found = []
const twoPointer = (l ,r, current) => { while(l<r){ const totalSum = current + x[l] + x[r] if (totalSum === target) { found.push([current, x[l], x[r]]) return } else if (totalSum > target) { r-- } else { l++ } }}
const threeSum = (x, target) => { for (let i=0;i<x.length;i++) { const current = x[i]; let leftPointer = i+1 let rightPointer = x.length - 1
if (current+x[leftPointer]+x[rightPointer] === target) { found.push([current, x[leftPointer], x[rightPointer]]) } else { twoPointer(leftPointer, rightPointer, current) } } return found}
复制代码


6) G 给定一个字符串与一个整数 k,找到所有不同字符恰好出现 k 次的子字符串数。


https://www.geeksforgeeks.org/number-substrings-count-character-k/


解:


const subStrHasSameCharCount = (str, startIndex, endIndex, totalHop) => {  let charMap = {}  for (let k=startIndex;k<endIndex;k++) {    let currentChar = str[k]    if (charMap[currentChar]) {      charMap[currentChar]++    } else {      charMap[currentChar] = 1    }  }  let totalCount = Object.values(charMap).length > 0  return totalCount ? Object.values(charMap).every(item => item == totalHop) : false}

const characterWithCountK = (str, k) => { if (k == 0) return '' let count = 0 let initialHop = k while (initialHop < str.length) { for (let j=0;j<str.length;j++) { let startIndex = j let endIndex = j + initialHop if(endIndex > str.length) continue count = subStrHasSameCharCount(str, startIndex, endIndex, k) ? count + 1: count } initialHop+=k } count = subStrHasSameCharCount(str, 0, initialHop, k) ? count + 1: count return count}

let str = 'aabbcc'let k = 2console.log(characterWithCountK(str, k))
复制代码


7) 给定两个输入字符串 s1 与 s2,其中包含来自 a 到 z 且以不同顺序排列的字符,请证明能否在 s1 中通过字符重新排列获得等于 s2 的字符串。


解:


let s1 = 'dadbcbc'let s2 = 'ccbbdad'let charMap = {}
const canBeRearranged = (s1, s2) => { if(s1.length!==s2.length){ return false } for(let i=0;i<s1.length;i++){ const charFromString1 = s1[i] const charFromString2 = s2[i] if(charFromString1 in charMap){ charMap[charFromString1]++ } else { charMap[charFromString1] = 1 } if(charFromString2 in charMap){ charMap[charFromString2]-- } else { charMap[charFromString2] = -1 } } for(let x in charMap){ if (charMap[x]!==0){ return false } } return true}
canBeRearranged(s1, s2)

复制代码


8) 给定一个数组或可变输入大小,编写一项函数以实现数组洗牌。


解:


const swap = (index1, index2, arr) => {  let temp = arr[index1]  arr[index1] = arr[index2]  arr[index2] = temp}
const shuffle = (arr) => { let totalLength = arr.length while(totalLength > 0) { let random = Math.floor(Math.random() * totalLength) totalLength-- swap(totalLength, random, arr) } return arr}

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]arr = shuffle(arr)
复制代码


9) 计算无限尝试的多维数组中,所有元素的加和。


解:


let arr = [4, 5, 7, 8, [5, 7, 9, [3, 5, 7]]]let sum = 0
const calculateSum = (arr) => { arr.reduce(function(acc, currentVal) { const isEntryArray = Array.isArray(currentVal) if (isEntryArray) { return acc.concat(calculateSum(currentVal)) } else { sum+=currentVal return acc.concat(currentVal) } }, [])}calculateSum(arr)console.log(sum)
复制代码


10) 展平一个表示变化债务的嵌套对象。


解:


const obj = {  level1: {    level2: {      level3: {        more: 'stuff',        other: 'otherz',        level4: {          the: 'end',        },      },    },    level2still: {      last: 'one',    },    am: 'bored',  },  more: 'what',  ipsum: {    lorem: 'latin',  },};
var removeNesting = function(obj, parent){ for (let key in obj){ if (typeof obj[key] === "object") { removeNesting(obj[key], parent+"."+key) } else { flattenedObj[parent+'.'+key] = obj[key] } }}
let flattenedObj = {}const sample = removeNesting(obj, "");console.log(flattenedObj);
复制代码


11) 给定一项 json 输入,其中每个条目代表一个目录,而各个目录又可以拥有自己的嵌套条目。请据此创建一套目录结构。


解:


https://jsbin.com/gajiweq/1/edit?js,console


12) 给定一个对象数组,其中包含员工数据列表,以保证每位员工都拥有对应的报告对象列表。使用此信息以构建员工层级结构。


解:


const employeesData = [{  id: 2,  name: 'Abhishek (CTO)',  reportees: [6]}, {  id: 3,  name: 'Abhiram (COO)',  reportees: []}, {  id: 6,  name: 'Abhimanyu (Engineering Manager)',  reportees: [9]}, {  id: 9,  name: 'Abhinav (Senior Engineer)',  reportees: []}, {  id: 10,  name: 'Abhijeet (CEO)',  reportees: [2, 3],}];
/*A (CEO)----B (CTO)--------D (Engineering Manager)------------E (Senior Software Engineer)----C (COO)*/
const findCeo = (currentEmp) => { let parentEmployee = employeesData.filter(emp => emp.reportees.indexOf(currentEmp.id) > -1) if (parentEmployee && parentEmployee.length > 0) { return findCeo(parentEmployee[0]) } else { return currentEmp }}
const logHierarchy = (currentEmp, indent) => { console.log("-".repeat(indent) + currentEmp.name) indent+=4; for(let i=0;i <currentEmp.reportees.length;i++) { let employee = employeesData.filter(emp => emp.id === currentEmp.reportees[i]) logHierarchy(employee[0], indent) }}
const traverse = (employee) => { let ceo = findCeo(employee) logHierarchy(ceo, 0)}
traverse(employeesData[0])
复制代码


13) 以螺旋形式输出给定的数组。


const inputMatrix = [  [1, 2, 3, 4, 5],  [6, 7, 8, 9, 10],  [11,12,13,14,15],  [16,17,18,19,20],]
const exprectOutput = [1,2,3,4,5,10,15,20,19,18,17,16,11,6,7,8,9,14,13,12]
复制代码


解:


function spiralParser(inputMatrix){  const output = [];  let rows = inputMatrix.length;  let cols = rows > 0 ? inputMatrix[0].length : 0;
//singleEmptyRow => Edge case 1 //[] if (rows === 0) { return [] }
if (rows === 1) { //singleElementRowNoCol => Edge case 2 //[[]] if (cols === 0) { return [] } else if (cols === 1){ //singleElementRow => Edge case 3 //[[1]] output.push(inputMatrix[0][0]) return output } }
let top = 0; let bottom = rows - 1; let left = 0; let right = cols - 1; let direction = 0; //0 => left->right //1 => top->bottom //2 => right->left //3 => bottom->top
while(left <= right && top <= bottom) { if(direction === 0) { //left->right for (let i=left; i<=right;i++) { output.push(inputMatrix[top][i]) } top++; } else if (direction === 1) { //top->bottom for (let i=top; i<=bottom;i++) { output.push(inputMatrix[i][right]) } right-- } else if (direction === 2) { //right->left for (let i=right; i>=left;i--) { output.push(inputMatrix[bottom][i]) } bottom-- } else if (direction === 3) { //bottom->top for (let i=bottom; i>=top;i--) { output.push(inputMatrix[i][left]) } left++ } direction = (direction + 1) % 4 } return output;}
console.log(spiralParser(inputMatrix2))
复制代码


14) 在给定字符串中找到最大的连续重复字符。


let str = 'bbbaaaaccadd'; // 最大重复字符数为 4
复制代码


解:


//sudo codemaxNow = if input string length is 1 or greater than 1 ? 1 : 0maxOverall = if input string length is 1 or greater than 1 ? 1 : 0
for char in inputString starting from index 1 if char equals prevChar maxNow++ maxOverall = max(maxOverall, maxNow) else if char not equals prevChar maxNow = 1
复制代码


15) 给定一个长度可变的输入数组,请在数组末尾将所有的数字 2 划分开。


let inputArr = [2,9,1,5,2,3,1,2,7,4,3,8,29,2,4,6,54,32,2,100]//ouput => [9,1,5,3,1,7,4,3,8,29,4,6,54,32,100,2,2,2,2,2]
复制代码


解:


let slowRunner = 0
for (let fastRunner=0;fastRunner<arr.length;fastRunner++) { if (arr[fastRunner]!==2 && arr[slow] == 2) { [arr[fastRunner], arr[slow]] = [arr[slow], arr[fastRunner]] slowRunner++ }}
复制代码


16) 反转一个链接列表。


//Input = 1 -> 2 -> 3 -> 4 -> 5 -> 6//Output = 1 <- 2 <- 3 <- 4 <- 5 <- 6
复制代码


解:


//sudo codelet current = headlet prev = nulllet next = null
while(current) { next = current.next current.next = prev prev = current current = next}
复制代码


17) 使用迭代对预排序树进行遍历(无递归)。


解:


//sudo codeconst preorder = (root) => {  let stack = []  stack.push(root)
while(there is element in stack) { let current = stack.pop() console.log(current.value) if (current.right) { stack.push(current.right) } if (current.left) { stack.push(current.left) } }}
复制代码


应用题


1) 设计一套停车场系统,要求满足以下需求:


  • 最多可容纳 N 辆车。实现对泊车位的可用性管理。

  • 保留车辆的出入记录。

  • 自动工单系统会自动对每辆出入汽车进行登记,包括以下详细信息:注册号、颜色、已分配的停车位。


这套系统应支持查询以下结果:


  • 查询所有特定颜色汽车的注册号。

  • 使用特定注册号查询该车辆的停车位。

  • 查询特定颜色汽车的停车位。

  • 列出当前停车场内所有可用空位的列表。


要求:


  • 可以使用任何代码结构:Classes/Structs。

  • 您的解法应具备可扩展性,用以支持未来更多用例。


低代码设计原则:


  • 代码模块化。

  • 命名约定。

  • SOLID 原则。


解:


https://github.com/devAbhijeet/parking-lot-design-js


2) 创建一款 react 组件 Ping,用于对特定 URL 执行 API 调用。如果 API 调用返回的状态代码为 200,则表示用户在线。如果 API 调用返回的状态代码不是 200,则表示用户处于脱机状态。


尝试更改开发工具网络页面中的 status 表单。


解:


https://codesandbox.io/s/admiring-davinci-xnjef


3) 使用 json 输入创建一款动态表单构建器。表单可以根据 ID 进行分组,且每个组中可以包含一个嵌套组。


解:


https://codesandbox.io/s/great-noyce-75kup


4) 以纯 JavaScript 代码创建一份精简 excel 表格,该表格应支持对行与列的添加及删除功能。需要在 40 分钟内完成。


解:


https://codesandbox.io/s/smoosh-thunder-krv8m


5) 请制作一个搜索输入框,以供在用户列表中执行搜索。


用户对象中包含以下字段:


id: 一条唯一 idname: 用户名items: 用户订购商品清单address: 用户地址pincode: 用户地址邮政编码
复制代码


  • 您的搜索方案必须涵盖所有字段。

  • 搜索结果以用户卡列表的形式显示。


总结


  • 在搜索输入框内键入内容后,其会打开搜索结果列表。您的解法可以仅实现字符串匹配搜索。

  • 用户卡列表可以通过键盘或鼠标进行导航。如果同时使用鼠标与键盘进行导航,则每次只突出显示一张用户卡(如果鼠标悬念在列表上,则键盘优先;如果未使用键盘操作,则鼠标优先)。

  • 其行为类似于 YouTube 网站的搜索方式。

  • 当未找到搜索结果时,显示空白卡。

  • 卡列表应支持滚动。

  • 突出显示的卡片(通过键盘 / 鼠标)将自动滚动至视图区域内。


解:


https://codesandbox.io/s/silly-moon-31m7u


杂项


1) 您如何设计前端应用程序的架构?


2) 实现懒加载


3) 服务器端渲染是什么?


4) 如何在生产环境中部署一款 React app。


5) 服务工作节点 /Web 工作节点是什么。


6) 如何优化 Web 应用程序并提高其性能表现。


7) 请尝试解释不同类型的客户端缓存策略。


8) CORS 是什么。


9) React 中有哪些高阶组件。


10) Redux 中的连接功能如何起效。


11) React 中的纯组件是什么。


资源


https://github.com/devAbhijeet/learning-resources


英文原文


All front end Interview questions asked during my recent job hunt


2020 年 9 月 08 日 09:54857
用户头像
小智 InfoQ 主编

发布了 397 篇内容, 共 308.6 次阅读, 收获喜欢 1719 次。

关注

评论 1 条评论

发布
用户头像
为啥没有评论,都找到工作了?

2020 年 09 月 09 日 17:07
回复
没有更多了
发现更多内容

五面进军饿了么!复盘总结11月上半月大厂面试真题,押题命中率高达95%以上

Java架构追梦

Java 阿里巴巴 架构 面试经历 面试题总结

拒招中国程序员后,开源平台 GitLab 又开始大规模封杀开发者账户

Java架构师迁哥

关于linux操作系统中的buff/cache

程序员架构进阶

Linux cache buffer

SQL数据库:子查询和关联子查询

大规模数据处理学习者

SQL子查询 SQL关联查询

USDT币支付系统开发搭建,区块链承兑商支付平台

13530558032

【涂鸦物联网足迹】涂鸦云平台标准指令集说明

IoT云工坊

人工智能 cpu 物联网 智能家居 指令集

快速理解二十三种设计模式(速记)

simon

设计模式 23种设计模式 Java设计模式

亿级大表分库分表实战总结(万字干货,实战复盘)

比伯

Java 编程 程序员 架构 计算机

usdt区块链支付系统开发,承兑支付平台搭建

WX13823153201

usdt区块链支付系统开发

下笔如有神:这是一个基于营销行业的 AI 技术实践

京东智联云开发者

人工智能 自然语言处理 nlp

数字货币钱包开发费用,区块链钱包开发优势

13530558032

#不吐不快# IT职场里的奇葩经历

InfoQ写作平台官方

职场搞笑 活动专区 奇葩的经历

成年人的世界都不容易-看看做到年薪50万的程序员,到底有多累?

Java架构师迁哥

从“小众”到“首选”,推动云原生产业落地华为云作用几何?

华为云开发者社区

云计算 架构 容器

遥感影像处理有高招,“专治”各类花式并发的述求!

华为云开发者社区

容器 k8s 遥感

React Fiber 是什么?

局外人

react.js 前端 React

从红黑树的本质出发,彻底理解红黑树!

996小迁

Java 架构 面试 程序人生

多线程问的太深入不知道怎么回答,从volatile开始给你讲清楚

小Q

Java 学习 面试 volatile 多线程

【乘风破浪的开发者】丁一超:从AI实战营出发探索未知的AI世界

华为云开发者社区

华为 AI modelarts

数字货币交易所功能,场外OTC交易所开发公司

13530558032

亿级大表分库分表实战总结(万字干货,实战复盘)

云流

学习 编程 架构 计算机网络

在Android中使用DataBinding(Kotlin)

simon

android Android进阶 JetPack DataBinding 数据绑定

python+requests对app和微信小程序进行接口测试

测试人生路

Python 接口测试

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

Java架构师迁哥

MySQL全面瓦解—子查询和组合查询

比伯

Java 编程 程序员 架构 计算机

Spring / Spring boot 异步任务编程 WebAsyncTask

Bruce Duan

异步任务编程 WebAsyncTask

覆盖全网的阿里微服务架构有多牛:K8S+实战+笔记+项目教程

马士兵老师

Java 程序员 微服务 Spring Cloud 阿里云 K8S

完美!阿里P8仅用242页笔记,就由浅入深讲解了SQL概念

马士兵老师

Java sql 阿里巴巴 SQL语法 sql查询

影响王兴的一本书

池建强

读书笔记 无限游戏 王兴

云算力挖矿模式系统开发,云算力平台搭建

13530558032

anyRTC AI降噪|让声音更清晰

anyRTC开发者

人工智能 AI 音视频 WebRTC RTC

飞猪Flutter技术演进及业务改造的实践与思考

飞猪Flutter技术演进及业务改造的实践与思考

我在近期求职中遇到的前端面试问题及其解法-InfoQ