web前端手撕合集

这篇文章包含了一些前端常见的手撕题,和部分我在面试过程中遇到的手撕题。非算法题。

防抖

function debounce(fn, delay, immediate = false) {
    let timer
    let flag = true

    return function () {
        if (flag && immediate) {
            fn.apply(this, arguments)
            flag = false
            return
        }
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(this, arguments)
        }, delay)
    }
}

节流

function throttle(fn, interval) {
    let last = 0

    return function () {
        if (Date.now() - last < interval) return
        last = Date.now()
        fn.apply(this, arguments)
    }
}

柯里化

function curry(fn, ...args1) {
    if (args1.length >= fn.length) {
        return fn(...args1)
    } else {
        return (...args2) => curry(fn, ...args1, ...args2)
    }
}

浅拷贝

function shallowCopy(obj) {
    return Array.isArray(obj) ? [...obj] : { ...obj } // or
    return Object.assign(Array.isArray(obj) ? [] : {}, obj)
}

深拷贝

function deepClone(o, wm = new WeakMap()) {
    if (wm.has(o)) return wm.get(o)

    let co = Array.isArray(o) ? [] : {}
    typeof o === 'object' && o !== null && wm.set(o, co)

    for (let k of Object.getOwnPropertySymbols(o)) {
        if (typeof o[k] === 'object' && o[k] !== null) {
            co[k] = deepClone(o[k], wm)
        } else {
            co[k] = o[k]
        }
    }
    for (let k in o) {
        if (o.hasOwnProperty(k)) {
            if (typeof o[k] === 'object' && o[k] !== null) {
                co[k] = deepClone(o[k], wm)
            } else {
                co[k] = o[k]
            }
        }
    }

    return co
}

数组最大深度

function getDepth(ele) {
    if (!Array.isArray(ele)) {
        return 0
    }
    let maxDepth = 0
    ele.forEach(v => {
        maxDepth = Math.max(maxDepth, getDepth(v))
    })
    return maxDepth + 1
}

数组flat

Array.prototype.myFlat = function (depth = 1) {
    if (depth <= 0) return [...this];
    return this.reduce((p, c) => {
        if (Array.isArray(c)) {
            p.push(...c.myFlat(depth - 1))
        } else {
            p.push(c)
        }
        return p
    }, [])
}

数组reduce

Array.prototype.myReduce = function (cb, initial) {
    let res = initial !== undefined ? initial : this[0]
    let start = initial !== undefined ? 0 : 1
    for (let i = start; i < this.length; ++i) {
        res = cb(res, this[i])
    }
    return res
}

new

function myNew(con, ...args) {
    if (!con instanceof Function) {
        throw new Error()
    }
    // let obj = {}
    // obj.__proto__ = con.prototype
    // or
    let obj = null
    obj = Object.create(con.prototype)
    let result = con.apply(obj, args)
    let flag = result && (typeof result === 'object' || typeof result === 'function')
    return flag ? result : obj
}

call & apply

Function.prototype.myCall = function (context, ...args) {
    context = context === null || context === undefined ? globalThis : Object(context)
    const fnk = Symbol()
    Object.defineProperty(context, fnk, { enumerable: false, value: this })
    const r = context[fnk](...args)
    delete context[fnk]
    return r
}

Function.prototype.myApply = function (context, args) {
    context = context === null || context === undefined ? globalThis : Object(context)
    const fnk = Symbol()
    Object.defineProperty(context, fnk, { enumerable: false, value: this })
    const r = context[fnk](...args)
    delete context[fnk]
    return r
}

bind

Function.prototype.myBind = function (context, ...args) {
    context = context === null || context === undefined ? globalThis : Object(context)
    const func = this

    return function (...subArgs) {
        const allArgs = [...args, ...subArgs]
        if (new.target) {
            return new func(...allArgs)
        } else {
            return func.apply(context, allArgs)
        }
    }
}

create

function myCreate(obj) {
    function F() { }
    F.prototype = obj
    return new F()
}

instanceof

function myInstanceof(obj, con) {
    let pro = obj?.__proto__
    while (pro) {
        if (pro === con.prototype) {
            return true
        }
        pro = pro.__proto__
    }
    return false
}

Promise.all

Promise.myAll = function (promiseArr) {
    return new Promise((resolve, reject) => {
        if (!Array.isArray(promiseArr)) {
            throw new Error('argument should be array')
        }
        let count = 0,
            promiseArrLength = promiseArr.length,
            resolved = []
        for (let i = 0; i < promiseArr.length; ++i) {
            Promise.resolve(promiseArr[i]).then((res) => {
                resolved[i] = res
                ++count
                if (count === promiseArrLength) {
                    resolve(resolved)
                }
            }, (rej) => {
                reject(rej)
            })
        }
    })
}

Promise.race

Promise.myRace = function (promiseArr) {
    return new Promise((resolve, reject) => {
        if (!Array.isArray(promiseArr)) {
            throw new Error('argument should be array');
        }
        promiseArr.forEach(promise => {
            Promise.resolve(promise).then(resolve, reject)
        })
    })
}

Promise.retry

Promise.retry = function (fn, retries) {
    return new Promise((resolve, reject) => {
        Promise.resolve(fn())
            .then(resolve)
            .catch(error => {
                if (retries > 0) {
                    console.log(`Retrying... ${retries} attempts left`);
                    Promise.retry(fn, retries - 1)
                        .then(resolve)
                        .catch(reject);
                } else {
                    reject(error);
                }
            });
    })
}

Promise.queue

Promise.queue = function (promiseArr) {
    return new Promise((resolve, reject) => {
        const resultArr = [];
        // (async () => {
        //     for (let i = 0; i < promiseArr.length; i++) {
        //         try {
        //             resultArr[i] = await promiseArr[i]()
        //         } catch (err) {
        //             reject(err)
        //             return
        //         }
        //     }
        //     resolve(resultArr)
        // })()
        // or
        function runPromise(index) {
            if (index >= promiseArr.length) {
                resolve(resultArr)
                return
            }
            promiseArr[index]().then(res => {
                resultArr[index] = res
                runPromise(index + 1)
            }, err => {
                reject(err)
                return
            })
        }
        runPromise(0)
    })
}

promisify

function promisify(func) {
    return function (...args) {
        return new Promise((resolve, reject) => {
            func(...args, (err, result) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(result);
                }
            });
        });
    };
}

Event Bus

class EventBus {
    constructor() {
        this.events = {}
    }

    on(event, callback) {
        if (this.events[event] === undefined) {
            this.events[event] = new Set()
        }
        this.events[event].add(callback)
    }

    off(event, callback) {
        if (this.events[event]) {
            this.events[event].delete(callback)
            if (!this.events[event].size) delete this.events[event]
        }
    }

    emit(event, ...args) {
        if (this.events[event]) {
            this.events[event].forEach(cb => {
                cb(...args)
            })
        }
    }

    once(event, callback) {
        const onceCallback = (...args) => {
            this.off(event, onceCallback)
            callback(...args)
        }
        this.on(event, onceCallback)
    }
}

sumOf

function sum(...args1) {
    const ret = (...args2) => sum(...args1, ...args2)
    ret.sumOf = () => args1.reduce((acc, cur) => acc + cur, 0);
    return ret
}

console.log(sum(1, 2, 3).sumOf()); // 6
console.log(sum(1, 2)(3).sumOf()); // 6
console.log(sum(1)(2)(3).sumOf()); // 6

hardMan

hardMan('潘潘')

Hi! I am 潘潘.

hardMan('潘潘').study('敲码')

Hi! I am 潘潘. I am studying 敲码.

hardMan('潘潘').rest(3).study('敲码')

Hi! I am 潘潘. 【等待三秒】 I am studying 敲码.

hardMan('潘潘').restFirst(3).study('敲码')

【等待三秒】 Hi! I am 潘潘. I am studying 敲码.

function hardMan(name) {
    this.name = name;
    this.queue = []
    this.queue.push(() => {
        return new Promise(resolve => {
            console.log(`Hi! I am ${this.name}`)
            resolve()
        })
    })
    this.rest = (sec) => {
        this.queue.push(() => new Promise(resolve => {
            setTimeout(resolve, sec * 1000)
        }))
        return this
    }
    this.restFirst = (sec) => {
        this.queue.unshift(() => new Promise(resolve => {
            setTimeout(resolve, sec * 1000)
        }))
        return this
    }
    this.study = (name) => {
        this.queue.push(() => new Promise(resolve => {
            console.log(`I am studying ${name}`)
            resolve()
        }))
        return this
    }
    this._run = () => {
        if (this.queue.length) {
            const task = this.queue.shift()
            task().then(() => {
                this._run()
            })
        }
    }
    setTimeout(this._run)
    return this
}

限制最大并发

class Schedular {
    constructor() {
        this.tasks = [];
        this.runningTasks = 0;
        this.maxRunningTasks = 2;
    }

    add(task) {
        return new Promise((resolve) => {
            this.tasks.push([task, resolve]);
            this._run();
        });
    }

    _run() {
        if (this.runningTasks >= this.maxRunningTasks || !this.tasks.length) return
        this.runningTasks++;
        const [task, resolve] = this.tasks.shift();
        task().then(() => {
            this.runningTasks--;
            resolve();
            this._run();
        })
    }
}

const timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

const scheduler = new Schedular();
const addTask = (time, order) => {
    scheduler.add(() => timeout(time)).then(() => console.log(order))
}

addTask(1000, 1);
addTask(1000, 2);
// 1秒后输出12
addTask(1000, 3);
addTask(1000, 4);
// 再1秒后输出34

带优先级的fetch

class MyFetch {
    constructor() {
        this.queue = []
        this.count = 0
        this.maxCount = 5
    }

    fetch(url, options = {}, priority = 0) {
        return new Promise((resolve, reject) => {
            this.queue.push([priority, url, options, resolve, reject])
            this._run()
        })
    }

    _run() {
        if (this.count >= this.maxCount || this.queue.length === 0) return
        this.count++
        this.queue.sort((a, b) => b[0] - a[0])
        const [_, url, options, resolve, reject] = this.queue.shift()
        fetch(url, options).then(resolve).catch(reject).finally(() => {
            this.count--
            this._run()
        })
    }
}

重试函数 runWithRetry

重试函数:实现一个重试函数runWithRetry(handler: Function, times: number = 1, timeout?: number),支持异步

function runWithRetry(handler, times = 1, timeout) {
    return new Promise((resolve, reject) => {
        let timer;
        let timeouted = false;
        if (timeout !== undefined) {
            timer = setTimeout(() => {
                reject();
                timeouted = true;
            }, timeout);
        }
        function retry(times) {
            if (times <= 0) {
                clearTimeout(timer);
                reject();
                return;
            }
            Promise.resolve(handler()).then(
                (res) => {
                    clearTimeout(timer);
                    resolve(res);
                },
                () => {
                    if (!timeouted) retry(times - 1);
                },
            );
        }
        retry(times);
    });
}
#前端##面经#
全部评论
窝尿标点
2 回复 分享
发布于 2024-11-26 09:29 湖南
nb,搬进我博客整理的面试题了
1 回复 分享
发布于 2024-11-28 16:26 江西
你是我的神
1 回复 分享
发布于 2024-11-19 10:08 上海
进我的收藏夹吃灰去吧
1 回复 分享
发布于 2024-11-16 00:43 山东
收藏
点赞 回复 分享
发布于 04-17 10:41 广东
插眼
点赞 回复 分享
发布于 04-14 21:32 陕西
你是我见过最帅的牛客男孩
点赞 回复 分享
发布于 03-04 11:47 广东
你是我见过的最帅气的牛客男孩
点赞 回复 分享
发布于 02-04 19:49 安徽
阿里嘎多!
点赞 回复 分享
发布于 2024-11-16 21:46 北京
m
点赞 回复 分享
发布于 2024-11-15 23:32 湖北

相关推荐

04-25 15:51
华南理工大学
总结下来,其实自己这次暑期虽然投递了很多,但约面较少,进了美团也许是运气因素。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;美团:第一次二面挂,二面基本没问前端,全是计算机的内容(科班应该没问题),大致内容如下:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:学过操作系统和数据结构吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:不是计算机专业,了解的很浅。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:没关系,没学过,在我的引导下应该也能答出来,说说操作系统怎么进行内存管理的?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:(把看过的一点八股都说了)虚拟内存,分段分表这些浅层概念。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:具体是怎么划分的?用哪一种数据结构划分?这个管理的过程是什么样的?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:答了一点点后,就说不会了。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:好吧,那么现在假设有一段内存,你准备用什么方法分配?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:按照指定的大小,将起始地址设置为key,内存大小或者其它必要信息设置为value,使用一个map结构来实现。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后面有点忘了,就提出一些问题,比如有的需要内存小,有的需要内存大,这个就存在分配问题。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然面试官后面也在引导,但确实没啥概念,最后感觉也没答出来。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:说说TCP和UDP的区别吧?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:八股说了。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:既然你说到了拥塞避免和流量控制,详细讲讲过程。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:答了每次应答会回传一个值控制滑动窗口大小以及慢启动,拥塞避免,快重传这些八股。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:对回传这块深入询问。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:浮于表层的我,又答不出来了。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:尝试引导,以堵车为例子,什么交警如何知道堵车以及后续怎么控制拥堵程度。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:尝试作答,但感觉没答到面试官想要的点子上。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:你为什么要做这个项目?价值在哪里?(大致这个意思)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:额,这两个是学习项目,没有上线,学习前端开发的流程。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:好的,说说项目的亮点吧。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:说了虚拟列表的几种实现方法,轮播图以及电梯导航原生实现的三种方法。(可能这里提了自己在网上找了多种&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现方式,面试官觉得没有自己的思考?)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:这几种实现方式也是网上常规的,也就是都是网上寻找的现成方案吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:额,确实主要是以网上的方案为主体进行更改的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:你还觉得你项目有什么难点吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我:这时候已经有点晕头了,&nbsp;说这几个点确实都是网上找到方案做的,还说这些也不难&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:好的,进入下一个阶段。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:现在可以做一个智力题吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我说,可以换一个算法题吗?(开始介绍时,说了这个阶段是算法或者智力题,完全没做过那啥杯子倒水的智力题,就说换成算法吧)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;面试官:好的,但我这个可不是leetcode上的那种算法题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题目大致如下:相亲市场上有很多男女,让你设计一个算法,每轮随机进行配对,然后不允许配对已经配对过的,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每轮打印结果。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为时间不够,就说了下思路,把男女进行标号,用一个列表存储已经排列的男女,例如[男1-女1,男1-女2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后面问优化方案以及时间复杂度。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答完后面试官说没有答到每轮随机的设计方式。(可能当时听题目没太注意)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问你用过AI辅助开发吗?怎么用?用的chat还是Agent模式?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;反问。(工作日后被捞)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二轮美团一面:(主要还是AI)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.先问了下项目中某个功能的具体实现?问的蛮细,问的蛮久,比如这个组件传哪些参数,怎么动态生成。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.useCallback&nbsp;useMemo&nbsp;Memo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.跨域&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.用的什么AI工具开发前端?&nbsp;为什么用cursor?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.提到了agent模式,怎么用mcp工具查看选中DOM,怎么用AI检查内存泄漏,AI辅助开发的技巧有什么?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.要求打字结合说明,就说我用AI尝试开发一个苹果时钟APP,过程有哪些关键。比如明确AI的身份,要一步步的来&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把你需要的组件的大致结构传给AI,入参哪些,什么样的逻辑。(这部分就是主观的,完全看你平时怎么用AI辅&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;助来答就行)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.后面基本都是AI的一些浅层知识,哪几种大模型,区别,适用于哪些场景这些。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;美团二面:(全是AI)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也是问AI辅助开发有哪些诀窍,你会怎么使用,然后遇到一些问题怎么解决?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中途提了一嘴动态表单,然后面试官就给了一个需求让现场打开共享用AI辅助开发一个动态表单。(这个基本占据大量面试时间,最后没写出来。(cursor其实真没用多少,尤其是准备面试这段时间)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把你每次的提示词复制发送给面试官。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就问你怎么了解AI大模型发展?&nbsp;用过哪些?&nbsp;怎么用?&nbsp;以及大模型在哪些地方有缺陷?以及刚才你用AI辅助开发哪里存在问题?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;反问。(流程没变超多天,最后OC,感觉是前面的人鸽了很多?)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就以我以及身边的人而言,感觉确实前端开发对于大模型的应用很关注。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以我舍友为例,面的某杭州大厂,一面1小时,简单问了点八股和项目后,看到他的研究方向跟大模型有关,就畅谈了半小时的研究方向和大模型;&nbsp;二面1小时,应该全部是聊大模型;最后通过,说是部门最近想搞一个跟大模型结合的内容,想招点懂些这个的人进来可以搞点有意思的东西。(同学做的是这方面研究,但论文尚未投出,所以我觉得如果是冲算法岗位但确实大厂神仙打架进不去,可以尝试开发学点,当下大模型风口也许不问你开发很深的东西就让你通过了,后续进去也是做和大模型相关的东西,也许算是算法爷的曲线救国?)
点赞 评论 收藏
分享
评论
39
202
分享

创作者周榜

更多
牛客网
牛客企业服务