在今天的文章中,我想跟大家聊聊自己最近在 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.js
const 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+true
‘1’+true
‘2’ > ’3’
‘two’>’three’
解:
2
2
1true
false
true
7) 实现 bind 与 reduce。
解:
//bind
if (!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])
}
}
}
//reduce
Array.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 flags
setInterval=>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.1
var x = 1;
var y = x;
x = 0;
console.log(x, y);
//Q.2
var x = [1];
var y = x;
x = [];
console.log(x,y);
//Q.3
function Abc() { console.log(this); };
Abc()
new Abc();
//Q.4
var x = 1;
var obj = {
x: 2,
getX: function () {
return console.log(this.x);
}
};
obj.getX()
let a = obj.getX
console.log(a)
//Q.5
//How to get the a to log 2 in the above code
//Q.6
console.log("A");
setTimeout(() => console.log("B"), 0);
setTimeout(() => console.log("C"), 0);
console.log("D");
//Q.7
setTimeout(function() {
console.log("A");
}, 0);
Promise.resolve().then(function() {
console.log("B");
}).then(function() {
console.log("C");
});
console.log("D");
//Q.8
let obj1 = {
a:1,
b:2
}
function mutate(obj) {
obj = {a:4, c:6}
}
console.log(obj1)
mutate(obj1)
console.log(obj1)
解:
//A.1
0 1
//A.2
[] [1]
//A.3
window object is logged
//A.4
logs 2 and 1
//A.5
a.call(obj);
//A.6
A, D, B , C
//A.7
D, 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 := 1
B := A*2 + 2
C := 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 = 11
let 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: 5
if 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 = 7
let 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 = 2
console.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 code
maxNow = if input string length is 1 or greater than 1 ? 1 : 0
maxOverall = 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 code
let current = head
let prev = null
let next = null
while(current) {
next = current.next
current.next = prev
prev = current
current = next
}
17) 使用迭代对预排序树进行遍历(无递归)。
解:
//sudo code
const 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: 一条唯一 id
name: 用户名
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
更多内容推荐
解决实际问题的 24 个 ES6 代码段
这篇文章基于实际使用场景总结了24个ES6代码段,可用来解决项目中可能遇到的一系列问题。
网易被裁后,68 天吃透这份阿里学长甩我的 Android 面试笔记,竟让我收到字节跳动和小米 offer
(4)如何证明给定的链表是否包含循环?如何找到循环的头节点?(优酷)
2021-11-07
如何渲染好笔迹?
2021-08-13
Flutter 图表库 fl_chart 的使用解析 (二)- 折线图,Android 最牛教材
Color(0x444af699),],//? 线的宽度barWidth: 4,//? 线头是否是圆形isStrokeCapRound: true,//? 是否显示数据点dotData: FlDotData(show: false,),//? 是否显示线上区域aboveBarData: BarAreaData(show: showAboveBarData, colors: [const Color(0x444af699),
2021-11-05
【LeetCode】最大升序子数组和 Java 题解
给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。
2022-10-07
Python 代码阅读(第 56 篇):获取列表的前 n 个最大 / 最小值
本篇阅读的代码分别获取列表的前n个最大/最小值。 本篇阅读的代码片段来自于30-seconds-of-python。
2021-11-10
2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间。 每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序。 返回表示 所有 员工的 共同,正
2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间。每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序。返回表示 所有 员工的 共同,正数长度的空闲时间 的有限时间段的列表,同样需要排好序。输入:schedule = [[[1,3],
2022-10-07
Flutter 中 Wrap 的使用详解(含对比图) _ Flutter Widgets
Wrap(// 子项间距spacing: 10,// 行间距runSpacing: 20,children: List.generate(20, (index) => getItem(index)),)
2021-11-05
Android 基础到进阶四大组件之 ContentProvider 详解,安卓开发菜鸟教程
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PATH_USERS); //返回代码 public static final int USER_INFO = 1; //创建UriMatcher对象 private static UriMatcher uriMatcher; //创建静态代码块 static {
2021-11-05
51|RESTful Web Services(15):为什么选择在第一个测试之后就开始重构?
如果重构涉及功能上下文的重新划分,即提取/合并组件,就可视作对于架构的重构与梳理。
2022-07-05
【小程序项目开发 -- 京东商城】uni-app 之商品列表页面 (下)
🤵♂️ 个人主页: @计算机魔术师👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。
2022-08-30
2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短字符串。 如果答案不止一个,则可以返回满足条件的任意一个答案。 输入:str1 =
2023-07-07:给出两个字符串 str1 和 str2。
2023-07-07
35|for 循环:如何遍历一个对象里的所有元素?
2022-11-30
每日一题 | LeetCode 454 四数相加Ⅱ
给你四个整数数组nums1、nums2、nums3 和 nums4 ,数组长度都是n,请你计算有多少个元组 (i, j, k, l) 能满足:
2022-06-03
52|函数的返回值:如何得到函数的执行结果?
2022-12-14
80|Line Editor (2):如何重构生成与更新锚点控制点的逻辑?
想要用好TDD,仅仅关注测试是不够的,还需要在需求分解与功能上下文分解上花力气下功夫。
2022-09-13
力扣 260 - 只出现一次的数字||| 【哈希映射、异或位运算 + 分治思想】
对应力扣260.只出现一次的数字|||,包含哈希映射和异或位运算+分治思想两种解法,超详细步骤讲解
2022-09-10
通过树和图看如何在无序中找到路径和秩序
通过拓扑排序建立资源依赖;通过字典树建立Web API的路由
2022-11-01
leetcode 221. Maximal Square 最大正方形 (中等)
使用动态规划来解决,使用dp[i][j]表示以(i,j)为右下角,且只饮食1的正方形的边长最大值。如果我们能计算出所有dp[i][j]的值,那么其中的最大值即为矩阵中只饮食1的下方形的边长最大值,其平方即为最大下方形的面积。
2022-06-20
【LeetCode】 旅行终点站 Java 题解
给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。
2021-10-01
让所有人认同的文字称不上表达
推荐阅读
Sketch for mac(矢量绘图软件) 99.1 永久激活版
2023-11-15
Sketch 99 for mac(矢量绘图软件)
2023-11-08
Vue 的响应式机制就是个“坑”
39|语法扩展:通过 JSX 来做语法扩展
2022-12-17
数据可视化:卡片图、切片器、条形图、柱形图、折线图
2022-12-30
86|再回首:“高级数据类型与算法”单元小结
2023-01-11
文心一言 VS 讯飞星火 VS chatgpt (81)-- 算法导论 7.4 6 题
2023-08-25
电子书
大厂实战PPT下载
换一换 Yi Lv吕毅 | 国际资深 LeSS(大规模Scrum)认证师、敏捷教练及顾问
张红兵 | 枫清科技(Fabarta) AI 负责人
Luca Mezzalira | Amazon Web Service Principal Serverless Specialist Architect
评论 1 条评论