У Tencent есть два рукописных вопроса для интервью, приходите и посмотрите?

опрос

Недавно несколько одноклассников брали интервью у отдела исследований и разработок Tencent, и они пообщались со мной после того, как вернулись.В целом собеседование с Tencent было в порядке, но было два письменных тестовых вопроса, которые были очень запутанными в то время, и позже были отклонены из-за этих двух вопросов. письменные тестовые вопросы.

Потом, после того, как я получил эти два вопроса интервью, я не стал искать ответы. У меня были некоторые идеи в голове. После того, как я закончил, я пошел, чтобы сослаться на некоторые другие ответы. В целом похоже. Я буду разбираться с ними. в виде сообщений в блоге сегодня.

Как определить, что в адрес включен только qq.com

Я считаю, что этот вопрос прост для всех с первого взгляда, но это не так просто.Существует много форм URL: http://www.qq.com//через http://www.qq.com.cn//Нет прохода http://www.qq.com/a/b//через http://www.qq.com?a=1 // пройти http://www.123qq.com?a=1 //Не пройдено

В настоящее время мой первый взгляд состоит в том, чтобы использовать обычные правила для суждения.Вы можете сначала проигнорировать мой ответ и посмотреть, сможете ли вы написать обычные правила для проверки.

function check(url){
  if(/.*(\.qq\.com)($|[\?\/])/.test(url)){
    return true;
  }else{
    return false;
  }

}

Вышеупомянутое регулярное выражение на самом деле относительно простое, оно может заканчиваться на qq.com или включать ? и /, но есть ситуация, что если URL-адрес qq.com включен после параметра? http://www.qq.com?redirect=http://www.qq.com/a

function check(url){
  if(/^(http:\/\/[^=]+\.qq\.com)($|[\?\/])/.test(url)){
    return true;
  }else{
    return false;
  }
}

Вы можете извлечь предыдущее доменное имя, начинаться с http, включать qq.com, но не может содержать никаких символов, таких как =, и заканчиваться qq.com или включать ? и /

Для регулярного я добавляю другие знания. Скобки представляют выражения. При выполнении с помощью exec строки будут искать и сопоставляться в соответствии с подвыражениями.

/^(http:\/\/[^=]+\.qq\.com)($|[\?\/])/Этот регуляр содержит два выражения, поэтому при выполнении exec массив будет содержать три элемента, по умолчанию первым элементом является строка, которой может соответствовать регулярка. Второй элемент — это результат совпадения первого выражения, а третий элемент — результат совпадения второго выражения.

Как сложить две строки очень больших чисел

Этот вопрос выглядит относительно простым, но требуется немного усилий, чтобы написать его от руки, чтобы проверить наши мыслительные способности и способность к логическому мышлению.Мой первый инстинкт — преобразовать его в строку, выполнить кумулятивные вычисления отдельно и, наконец, использовать строку формы выход. Даже не думайте о parseInt напрямую!!!

Опять же, не смотрите на код, посмотрите, сможете ли вы сделать его самостоятельно!

var a = '10000000000000000000000'
var b = '456789345678945678945678'
function add(a,b)

Вариант первый

Идея: определить длину двух строк и сделать их одинаковой длины, добавив 0. Поскольку мы находимся в студенческие годы, это сложение и вычитание выполняется справа налево, поэтому мы инвертируем массив, чтобы мы могли позволить компьютеру реализовать это по нашим представлениям.В процессе выполнения мы должны рассмотреть ситуацию полных 10 в 1.После того,как все вычисления закончены,обратим его и объединим в строку через соединение для возврата.

// a 和 b 都为字符串,调用add后,返回一个相加的字符串
// a = '12345678'
// b = '456789'
function add(a,b){
    // 获取各自长度
    let i = a.length,j = b.length;
    // 判断谁大一些
    let len = i - j;
    let sum,sumArr = [];
    // 谁小,就在谁的前面补0,让两个长度相同
    // a = '12345678' b = '00456789'
    if(len > 0){
        b = appendZero(b,len);
    }else if(len<0){
        // 这个地方要把len变成正数
        a = appendZero(a,Math.abs(len));
        // 当b的长度比a大时,就把b的长度给i
        i = j;
    }
    // 由于日常运算都是从右往左,所以,我们反转数组
    let aArr = a.split('').reverse(), bArr = b.split('').reverse();
    for(let m = 0;m < i;m++){
        // 数组长度相同,同一位置的两个元素相加
        // 如果当前sumArr有值,说明可能是前面以为满10进了一个1
        let c = parseInt(aArr[m])+parseInt(bArr[m]) + (sumArr[m] || 0);
        if(c > 9){
            // 进10后,取余数
            sumArr[m] = c%10;
            // 如果进10了,则会往数组后一个元素放一个1
            sumArr[m+1] = parseInt(sumArr[m+1] || 0)+1;
        }else{
            sumArr[m] = c;
        }
    }
    // 最后数组反转,再合并成一个字符串
    sum = sumArr.reverse().join('');
    return sum;
}

function appendZero(str,len){
    for(let i=0;i<len;i++){
        str='0'+str;
    }
    // 或者使用ES6的repeat
    // str = '0'.repeat(len) + str;
    return str;
}

Эта схема выглядит немного сложной, но это относительно простой вычислительный метод, и я рассматривал его в самом начале.

Вариант 2

function add(a,b){
  // 获取各自长度
  a = a.split(''), b = b.split('');
  let sum=[],go=0;
  while(a.length || b.length){
    // 通过pop每次取一个
    let num1 = parseInt(a.pop()) || 0;
    let num2 = parseInt(b.pop()) || 0;
    // 两值相加,如果有进位就 + go
    let tmp = num1 + num2 + go;
     if(tmp > 9){
         go = 1;
         // 取余数
         tmp %= 10;
     }else{
         go = 0;
     }
     // array.unshift(item)表示在数组array的最前面插入
     sum.unshift(tmp)
  }
  if(go) sum.unshift(1);
  return sum.join('');
}

Второе решение выглядит проще, чем первый. Через цикл While на самом деле он на самом деле добавляет 0 до недостаточной длины, и ловко принимает элемент с конца через POP, что точно так же, как и предыдущий инверсию массива.

Хорошо, сегодня я познакомлю вас с двумя рукописными вопросами интервью Tencent, я надеюсь помочь всем.

Обратите внимание на передний конец, обратите внимание на будущее, я ваш маленький помощник: будущее переднего конца

В этой статье используетсяmdniceнабор текста