1223面试题——进程间通信、数组展开

164 阅读2分钟

操作系统

  • 进程间如何通信
  1. 管道,半双工,即不能同时在两个方向传输数据。且只能在父子进程之间传递
  2. FIFO,命名管道,不相关的进程之间也可以传输数据
  3. 消息队列,存储在内核中,进程可以从中读写数据。
  4. 信号量,主要用来控制进程同步
  5. 共享内存,进程共享同一区域内存
  6. 套接字,还可用于不同机器的进程通信
  • 线程间如何通信
  1. 共同访问全局变量
  2. 消息队列
  3. 事件

算法与数据结构

有效括号

给定一个只包括 []{}() 的字符串,判断字符串是否有效。

输入: "()"
输出: 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

}