Compartir tecnología

Preguntas de código de entrevista frontal

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Este artículo resume las preguntas de codificación encontradas durante el proceso de entrevista.

1. Promoción variable

2. Métodos relacionados con matrices

Tenga en cuenta que el verdadero valor devuelto es para retención, no para filtrado, así que no lo olvide. No es nada, es solo que lo olvidaré si no lo escribo personalmente durante medio año. . .

arr.filter((elemento, índice, actual) => {return arr.indexOf(elemento) == índice});.Puede quitar peso

La esencia del filtro es crear una nueva matriz y, si la función de devolución de llamada devuelve verdadero, se conservará. La línea de código anterior significa que solo se coloca la primera vez.

Deduplicación de doble puntero:

Utilice punteros dobles para reordenar la matriz. Si son iguales, el puntero rápido se moverá una posición hacia la derecha. Si no son iguales, el puntero lento se moverá una posición hacia la derecha. el puntero rápido a la derecha para comparar con la próxima vez:

  1. function doublePointer(nums) {
  2. if(nums.length < 2) {
  3. return nums;
  4. }
  5. let slow = 0;
  6. let fast = 1;
  7. let result = [nums[0]];
  8. while(fast < nums.length) {
  9. if (result[slow] == nums[fast]) {
  10. fast++;
  11. } else {
  12. slow++;
  13. result[slow] = nums[fast];
  14. fast++;
  15. }
  16. }
  17. return result;
  18. }
  19. const arr = [1,1,2,2,4,4];
  20. console.log(doublePointer(arr));

Entrada [1,1,2,2,4,4] y salida [1,2,4].

Si la matriz es un objeto:

const arr2 = [{id:1,tiempo: 2},{id:1,tiempo: 4},{id:2,tiempo: 2},{id:2,tiempo: 4},{id:3,tiempo: 5},

{id:3,tiempo: 2}];

Ahora necesitamos eliminar duplicados según el ID. Si los ID son iguales, solo se retendrá el objeto con el mayor tiempo:

[{"id":1,"hora":4},{"id":2,"hora":4},{"id":3,"hora":5}]

  1. function doublePointerByorder(nums) {
  2. if(nums.length < 2) {
  3. return nums;
  4. }
  5. let slow = 0;
  6. let fast = 1;
  7. let result = [nums[0]];
  8. while(fast < nums.length) {
  9. if (result[slow].id == nums[fast].id) {
  10. if(result[slow].time < nums[fast].time) {
  11. result[slow] = nums[fast];
  12. }
  13. fast++;
  14. } else {
  15. slow++;
  16. result[slow] = nums[fast];
  17. fast++;
  18. }
  19. }
  20. return result;
  21. }

console.log(doublePointerByorder(arr2)); Eso es todo.

Por supuesto, puede usar un objeto vacío para recordarlo. Cada vez, compare el tiempo correspondiente a la ID en el objeto y elija si desea sobrescribirlo. Después de recorrerlo, use un bucle for in para convertir el objeto en una matriz. Sin embargo, los punteros dobles son muy eficientes si la cantidad de datos es grande, sería más apropiado utilizar punteros dobles.

3. Referencia relacionada

La asignación de signo igual de variables de tipo de referencia no se afectará entre sí.

Sin embargo, se verá afectado por el uso de ab, que se considera una copia superficial, como se muestra a continuación.

  1. person1 = {name: 3};
  2. members = person1;
  3. members.name = 4;   // person1.name=4

Echemos un vistazo a un caso clásico relacionado con las citas. También fue una pregunta que no escribí cuando la encontré por primera vez durante la entrevista. Convierta la matriz en una estructura de árbol:

  1. function arrayToTree(items) {
  2. const tree = {};
  3. const map = {};
  4. items.forEach((item, index) => {
  5. const { id, parentId } = item;
  6. if (!map[id]) map[id] = { children: [] };
  7. const node = { ...item, children: map[id].children};
  8. map[id] = node;
  9. if (parentId) {
  10. if (!map[parentId]) {
  11. map[parentId] = { children: [] };
  12. } map[parentId].children.push(node);
  13. } else {
  14. tree[id] = node;
  15. }
  16. });
  17. console.log(map);
  18. }
  19. // 示例数组
  20. const items = [
  21. { id: 1, parentId: null, value: "A" },
  22. { id: 2, parentId: 1, value: "B" },
  23. { id: 3, parentId: 1, value: "C" },
  24. { id: 4, parentId: 2, value: "D" },
  25. { id: 5, parentId: 3, value: "E" }
  26. ];
  27. // 转换为树
  28. const tree = arrayToTree(items);

Puedes copiarlo directamente para ver el efecto, como una muñeca matrioska rusa. Es fácil de entender cuando se agrega la segunda capa a la primera. La dificultad es que cuando se agrega la tercera capa a la segunda capa. también hay una tercera capa debajo de la segunda capa de la primera capa. De hecho, si lo piensas detenidamente, puedes entender que hay un ["1"]. niños ["2"] debajo de un ["1"], y su valor no solo es igual a a["2"], sino que también una referencia es todas iguales y ejecuta a["1"].children.push(a["2"]);. Este beneficio viene cuando se ejecuta a["3"]={...item, children:[]}, se ejecuta a["2"].children.push(a["3"]), porque está dentro los datos de la operación, por lo que los lugares con la misma referencia (por ejemplo, a=b, b.push también afectará a a.push) también serán enviados, por lo que verá a["1"].children["2"] .niños a["3"]. Esta es la estructura de árbol correcta.

Si aún no lo entiendes, puedes intentar lo siguiente:

Como se muestra arriba: b1 se considera el nodo de primer nivel de a1, y modificar b1 afectará a a1. Aunque lo anterior es un bucle, las referencias en cada ámbito son las mismas.

3. Macrotareas y microtareas

2 4 5 código sincrónico, 3 micro tareas, 1 macro tarea.El único problema es que se imprimirá 4, pero no se ejecutará la devolución 3.

4. Operadores de comparación

Durante la comparación de conversión implícita, la matriz llama al método toString.

5. Escritura a mano antivibración y estrangulamiento

Tienes que escribirlo tú mismo. Si nunca lo has escrito antes, tendrás que romperlo durante la entrevista y lo más probable es que no puedas arrancarlo.Los siguientes son: ejecución inmediata anti-vibración y ejecución retrasada, limitación de ejecución inmediata y ejecución retrasada

  1. function debounce(fn, delay) {
  2. let timer = null;
  3. return function (...args) {
  4. timer && clearTimeout(timer);
  5. timer = setTimeout(() => {
  6. fn.apply(this, args);
  7. }, delay);
  8. }
  9. }
  10. function debounce_immediate(fn, delay, immediate = false) {
  11. let timer = null;
  12. let flag = true;
  13. return function (...args) {
  14. timer && clearTimeout(timer);
  15. if (immediate) {
  16. if (flag) {
  17. fn.apply(this, args);
  18. flag = false;
  19. }
  20. timer = setTimeout(() => {
  21. flag = true;
  22. }, delay);
  23. } else {
  24. timer = setTimeout(() => {
  25. fn.apply(this, args);
  26. }, delay);
  27. }
  28. }
  29. }
  30. function throttle(fn, delay) {
  31. let lastTime = 0;
  32. let timer = null;
  33. return function (...args) {
  34. const nowTime = Date.now();
  35. if (nowTime - lastTime > delay) {
  36. fn.apply(this, args);
  37. lastTime = nowTime;
  38. }
  39. }
  40. }
  41. function throttle_D(func, delayTime) {
  42. let delay = delayTime || 1000;
  43. let timer = null;
  44. return function (...args) {
  45. if (!timer) {
  46. timer = setTimeout(function () {
  47. func.apply(this, args);
  48. timer = null;
  49. }, delay);
  50. }
  51. }
  52. }

Recuerde traer argumentos. La diferencia esencial entre anti-vibración y aceleración es que la anti-vibración siempre reinicia el temporizador, mientras que la aceleración no lo hace. Si la aceleración siempre se activa, se ejecutará dentro de un cierto intervalo de tiempo y solo se ejecutará una vez. Si el anti-vibración se activa durante un minuto, solo se ejecutará una vez (ejecución inmediata o ejecución retrasada activada por el último clic).