讨论/技术交流/面试题目|腾讯|实习-前端代码题 | 技术人求职记/
面试题目|腾讯|实习-前端代码题 | 技术人求职记

字符串反转

三种写法

function reverse(str) {
    const result = str.split("");
    const n = result.length;
    for (let i = 0; i < n >> 1; i++) {
        [result[i], result[n - i - 1]] = [result[n - i - 1], result[i]];
    }
    return result.join("");
}

function reverse(str) {
    let result = "";
    const n = str.length;
    for (let i = n - 1; i >= 0; i--) {
        result += str[i];
    }
    return result;
}

function reverse(str) {
    const result = [];
    const n = str.length;
    for (let i = n - 1; i >= 0; i--) {
        result.push(str[i]);
    }
    return result.join("");
}

手写Array.prototype.filter

考虑到这两个边界处理情况应该勉强够用了

Array.prototype.filter = function (fn) {
    // 可能不是 function
    if (typeof fn !== "function") {
        throw new Error("not function");
    }
    // 可能通过call/apply调用时传入非数组
    if (!Array.isArray(this)) {
        throw new Error("not array");
    }
    const result = [];
    for (let i = 0; i < this.length; i++) {
        fn(this[i]) && result.push(this[i]);
    }
    return result;
};

数组去重

通常这个问题,不让用set处理,如果遍历又需要O(N^2),一般不是面试官想看到的答案,用空间换时间的办法实现时间复杂度O(N):

function getTypeAndVal(obj) {
    if(typeof obj === 'object' && obj) {
        return typeof obj + JSON.stringify(obj);
    }
    return typeof obj + obj.toString();
}
// 这样写可能更合理
function getTypeAndVal(obj) {
    if(typeof obj === 'object' && obj) {
        return Object.prototype.toString.call(obj) + JSON.stringify(obj);
    }
    return Object.prototype.toString.call(obj) + obj.toString();
}

Array.prototype.deleteRepeat = function () {
    let temp = {};
    if (!Array.isArray(this)) {
        throw new Error("not array");
    }
    const array = this;
    const n = array.length;
    const result = [];
    for (let i = 0; i < n; i++) {
        const key = getTypeAndVal(array[i]);
        if (!temp.hasOwnProperty(key)) {
            result.push(array[i]);
            temp[key] = true;
        }
    }
    temp = null;
    return result;
};
console.log([1, 2, 3, 4, 5, 5, "5", "5",{1:2,3:4},{1:2,3:4}].deleteRepeat());

实现一个方法,功能是删除字符串中不合法字符,并返回更正后字符串。字符串只能包括 数字、字母、-、_

function deleteChar(str) {
    str = str.split('');
    str = str.filter(char => ((char >= '0' && char <= '9') || (char >= 'a' && char <= 'z') || (char >='A' && char <='Z') || char === '-' || char ==='_'));
    return str.join('');
}
console.log(deleteChar('qwert`@-+_A21'))

function deleteChar(str) {
    const array = [];
    const n = str.length;
    for (let i = 0; i < n; i++) {
        if((str[i] >= '0' && str[i] <= '9') || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >='A' && str[i] <='Z') || str[i] === '-' || str[i] ==='_') {
            array.push(str[i]);
        }
    }
    return array.join('');
}
//使用match生成数组,再使用join转回字符串
function deleteChar (str) {
    return str.match(/[A-Za-z0-9\-\_]/g).join('');
}
//利用replace也可以
function deleteChar(str) {
  return str.replace(/[^A-Za-z0-9\-\_]/g, '');
}

console.log(deleteChar('qwert`@-+_A21'))

有更好的实现可以评论区分享~谢谢各位

15
共 22 个回复

你觉得我写复杂了,可是面试官就想看这个版本的,叫我手写reverse,手写filter这些东西

2

对象的key是字符串,假如基本变量类型 1 和 ‘1’,直接丢进去,那就会被当成重复的了。

1

至于对象的去重,这个写法就不是很好了,除非考虑模拟stringify的写法递归的把对象中每个键值对用getTypeAndVal处理一下。一般面试考的时候考虑到时间复杂度的优化+类型判断的优化就够了

是想问排序(O(nlogn)O(nlogn))之后做一次遍历?另外你的答案里,中间步骤为啥要用getTypeAndVal这个函数处理一次key呢,直接把key放进去不行吗

就是模拟一个set呗,那你用n^2的indexof之类的不也一样被说吗…

数组去重那个写法,不让用set,你用object,这不是一个意思吗...

手撕代码的编程语言可以自选吗?

楼主牛蛙

i < n>>1啊

应该不行