操作系统
- 进程间如何通信
- 管道,半双工,即不能同时在两个方向传输数据。且只能在父子进程之间传递
- FIFO,命名管道,不相关的进程之间也可以传输数据
- 消息队列,存储在内核中,进程可以从中读写数据。
- 信号量,主要用来控制进程同步
- 共享内存,进程共享同一区域内存
- 套接字,还可用于不同机器的进程通信
- 线程间如何通信
- 共同访问全局变量
- 消息队列
- 事件
算法与数据结构
有效括号
给定一个只包括 []{}() 的字符串,判断字符串是否有效。
输入: "()"
输出: true
输入: "[()]"
输出: true
输入: "{()]"
输出: false
function match(s) {
// 转换规则
let ru = {
"[": 1,
"]": -1,
"{": 2,
"}": -2,
"(": 3,
")": -3
}
// 栈
let stack = []
// 索引
let p = 0
while (p!==s.length)
{
// 左括号就入栈
if (ru[s[p++]] > 0)
{
stack.push(s[p-1])
} else {
// 右括号就尝试匹配
if (ru[stack[stack.length-1]] + ru[s[p-1]] === 0) {
// 匹配则弹出
stack.pop()
}
else {
// 不匹配直接为false
return false
}
}
}
// 全部抵消则是匹配的
return stack.length == 0
}
JS
数组转换
把一个一维数组(数据只包含Number)[2,3,4]转为234你有哪些方式
[2,3,4].join("")
[2,3,4].toString().replace(/,/g, "")
[2,3,4].reduce((a,b)=>a+b, "")
数组展平
一个多维数组,转换成一维数组,方案有多种,能写几种算几种
function _flat(){
// ...code
}
_flat([1,[2,[3]]]) // [1,2,3]
// 递归
function _flat(arr) {
let result = []
for (let i=0; i<arr.length; i++) {
if (arr[i] instanceof Array) {
result = [...result, ..._flat(arr[i])]
} else {
result.push(arr[i])
}
}
return result;
}
// 迭代(还没写好,展开之后顺序是乱的)
function _flat(arr) {
let result = []
let queue = []
queue.push(arr)
while(queue.length) {
let item = queue.shift()
for (let i=0; i<item.length; i++) {
if (item[i] instanceof Array) {
queue.push(item[i])
}
else {
result.push(item[i])
}
}
}
return result
}