【面试】蚂蚁一面总结

183 阅读2分钟

首先面试直接上来给了链接的题目,写吧,基本写出来了,但是没有调试,现在再写发现中间有错误的,但是思路都对了的。

后来开始对着简历问,问的基本都是项目,最近的面试都问项目,咋都不好好问技术了,一面不是问技术吗?

题目一

请你编写一段可应用于所有数组的代码,使任何数组调用 array. groupBy(fn) 方法时,它返回对该数组 分组后 的结果。

  • 数组 分组 是一个对象,其中的每个键都是 fn(arr[i]) 的输出的一个数组,该数组中含有原数组中具有该键的所有项。
  • 提供的回调函数 fn 将接受数组中的项并返回一个字符串类型的键。
  • 每个值列表的顺序应该与元素在数组中出现的顺序相同。任何顺序的键都是可以接受的。
  • 请在不使用 lodash 的 _.groupBy 函数的前提下解决这个问题。
/**
 * 例如:输入:
 * array = [{"id":"1"}, {"id":"1"}, {"id":"2"}], 
 * fn = function (item) { 
 *    return item.id; 
 * }
 * 输出:
 * { 
 * "1": [{"id": "1"}, {"id": "1"}],   
 * "2": [{"id": "2"}] 
 * }
 */

答案

Array.prototype.groupBy = function(fn) {
    const map = {};
    const arr = this;
    for (let i = 0; i < arr.length; i++) {
        const key = fn(arr[i]);
        if (map[`${key}`]) {
            map[`${key}`].push(arr[i]);
        } else {
            map[`${key}`] = [arr[i]];
        }
    }
    return map;
}

array = [{"id":"1"}, {"id":"1"}, {"id":"2"}], 
fn = function (item) { 
  return item.id; 
}
array.groupBy(fn);

题目二

编写一个类,它允许获取和设置键-值对,并且每个键都有一个过期时间。类似浏览器的缓存数据的存取,存入的数据可设置过期时间。

该类有三个公共方法:

  • set(key, value, duration) :接收参数为整型键 key 、整型值 value 和以毫秒为单位的持续时间 duration 。一旦 duration 到期后,这个键就无法访问。如果相同的未过期键已经存在,该方法将返回 true ,否则返回 false 。如果该键已经存在,则它的值和持续时间都应该被覆盖。
  • get(key) :如果存在一个未过期的键,它应该返回这个键相关的值。否则返回 -1 。
  • count() :返回未过期键的总数。
class Cache {
    map = {};
    set(key, value, duration) {
        const now = new Date().getTime();
        const last = this.map[key];
        this.map[key] = {
            value,
            expired: now + duration
        };
        if (last && last.expired - now > 0) {
            return true;
        }
        return false;
    }
    get(key) {
        console.log(this.map)
        const val = this.map[key];
        const now = new Date().getTime();
        if (val && val.expired - now > 0) {
            return val;
        }
        return -1;
    }
    count() {
        let count = 0;
        Object.keys(this.map).forEach((key) => {
            const now = new Date().getTime();
            if (this.map[key].expired - now > 0) {
                count++;
            }
        });
        return count;
    }
}

const c = new Cache();
c.set('a', 'a', 1000);
c.set('a', 'a', 3000);
c.set('b', 'b', 400);
c.set('c', 'c', 600);

console.log(c.get('a'));
console.log(c.get('b'));
console.log(c.get('c'));

console.log(c.count())

setTimeout(() => {
    console.log(c.get('a'));
    console.log(c.get('b'));
    console.log(c.get('c'));
    console.log(c.count());
}, 1000);


题目三

用js实现一个请求方法,模拟浏览器限制最大并发请求数量,最多并发6个。

  • 由于每个请求执行时间不确定,因此前6个请求应该会立即被发送,而后面的请求会等待前面的请求完成后再发送
  • 比如我先一起发调用了4次请求,等待300ms后又一起发送了4个请求,那真正发出的请求只有前6个,后面2个要排队,等有空闲时请求发出去,并当请求返回数据后能正确返回给调用方 */
function concurrencyRequest(urls, max) {
    return new Promise((resolve, reject) => {
        const result = [];
        let count = 0;
        const len = urls.length;
        async function run() {
            const url = urls.shift();
            if (!url) {
                return;
            }
            const index = count++;
            try {
                const res = await fetch(url);
                result[index] = res;
            } catch(err) {
                result[index] = err;
            }
            if (count === len) {
                resolve(result);
            }
            run();
        }
        for (let i = 0; i < max; i++) {
            run();
        }
    });
}

const urls = [];
for (let i = 1; i <= 20; i++) {
    urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);
}
concurrencyRequest(urls, 3)
    .then(res => console.log('final', res));

其他技术问题

  1. webpack如何进行项目优化

image.png

总结

这次面试没问太多技术的问题,一直问项目,可能时间年限一长项目占比更高,准备的八股文统统没用到。然后问了下结果,没给过,顿时像泄了气的皮球,真是很打击人,最近面试不管面的好坏都不过,面的不好吧,我知道过不了,当你觉得面的还不错的时候,还是过不去,真是无语。不知道到底怎么才能面试通过。

也许之前没有跟上进度,现在还想跳一跳就是不切实际的吧,这两天搞的郁闷的要死,现在学习都没有动力了,因为不知道学了能用到哪里,我改怎么办?难道我的技术生涯就这样完了吗?太不甘心了。