Eficiencia de tiempo de oferta de espada

1. El número de ocurrencias en la matriz excede la mitad

Descripción del problema:

Hay un número en la matriz que aparece más de la mitad de la longitud de la matriz. Encuentre este número. Por ejemplo, ingrese una matriz de longitud [1,2,3,2,2,2,5,4,2]. Dado que el número 2 aparece en la matriz 5 veces, más de la mitad de la longitud de la matriz, por lo tanto, la salida 2. Si no existe, salida 0.

function MoreThanHalfNum_Solution(numbers) {
  // write code here
  var len = numbers.length;
  var obj = {};
  numbers.forEach((item) => {
    if (!obj[item]) {
      obj[item] = 1;
    } else {
      obj[item]++;
    }
  });
  for (let key in obj) {
    if (obj[key] > len / 2) {
      return key;
    }
  }
  return 0;
}

2. El menor número de K

Descripción del problema:

Ingrese n enteros para encontrar el número K más pequeño. Por ejemplo, ingrese 4, 5, 1, 6, 2, 7, 3 y 8 dígitos, luego los 4 dígitos más pequeños son 1, 2, 3 y 4.

Método uno: ordenación rápida

function GetLeastNumbers_Solution(input, k) {
  // write code here
  if (k > input.length) return [];
  quickSort(input);
  return input.slice(0, k);
}

function quickSort(input, left = 0, right = input.length - 1) {
  if (left >= right) return;
  var baseId = left;
  var baseVal = input[baseId];
  var i = left;
  var j = right;
  while (i < j) {
    while (j > i && input[j] >= baseVal) {
      j--;
    }
    while (i < j && input[i] <= baseVal) {
      i++;
    }
    [input[i], input[j]] = [input[j], input[i]];
  }
  [input[baseId], input[j]] = [input[j], input[baseId]];
  quickSort(input, left, j - 1);
  quickSort(input, j + 1, right);
  return input;
}

Método 2: clasificación de burbujas

function GetLeastNumbers_Solution(input, k) {
  // write code here
  if (k > input.length) return [];
  for (let j = input.length - 1; j >= input.length - k; j--) {
    for (let i = 0; i < j; i++) {
      if (input[i] < input[i + 1]) {
        [input[i], input[i + 1]] = [input[i + 1], input[i]];
      }
    }
  }
  var res = [];
  while (k > 0) {
    res.push(input.pop());
    k--;
  }
  return res;
}

Método 3: ordenar

function GetLeastNumbers_Solution(input, k) {
  // write code here
  if (input.length < k) {
    return [];
  }
  input.sort((a, b) => a - b);
  return input.slice(0, k);
}

3. Suma máxima de subarreglos consecutivos

Descripción del problema:

HZ ocasionalmente toma algunas preguntas profesionales para engañar a los que no son informáticos. Después de la reunión del grupo de prueba de hoy, volvió a hablar: en el antiguo reconocimiento de patrones unidimensionales, a menudo es necesario calcular la suma máxima de sub-vectores continuos. Cuando los vectores son todos números positivos, el problema se resuelve bien. Sin embargo, si el vector contiene números negativos, ¿debería contener un número negativo y esperar que el número positivo al lado lo compense? Por ejemplo: {6, -3, -2,7, -15,1,2,2}, la suma máxima de subvectores consecutivos es 8 (comenzando del 0 al 3). Da una matriz y devuelve la suma de sus subsecuencias consecutivas más grandes, ¿serás engañado por él? (La longitud del subvector es al menos 1)

/*
举例:array = [1, -2, 3, 10, -4, 7, 2, -5]
初始化 max = 1, temp = 1
i = 1时, temp = -1, max = 1
i = 2时, temp = 3,  max = 3
i = 3时, temp = 13, max = 13
i = 4时, temp = 9 , max = 13
i = 5时, temp = 16, max = 16
i = 6时, temp = 18, max = 18
i = 7时, temp = 13, max = 18;
*/

function FindGreatestSumOfSubArray(array) {
  // write code here
  var max = array[0],
    sum = array[0];
  for (let i = 1; i < array.length; i++) {
    if (sum <= 0) {
      sum = array[i]; //sum是负数说明前面的数没有贡献,重新赋值一个数
    } else {
      sum += array[i]; //sum不是负数说明当前值有贡献
    }
    if (sum > max) {
      max = sum;
    }
  }
  return max;
}

4. El número de ocurrencias de 1 en enteros (el número de ocurrencias de 1 en enteros de 1 a n)

Descripción del título:

¿Encontrar el número de ocurrencias de 1 en enteros de 1 a 13 y calcular el número de ocurrencias de 1 en enteros de 100 a 1300? Por esta razón, contó los números en 1 ~ 13 que contienen 1 como 1, 10, 11, 12 y 13, por lo que aparecieron 6 veces en total, pero no estaba equivocado sobre el último problema. ACMer espera que pueda ayudarlo y hacer que el problema sea más general. Puede encontrar rápidamente el número de ocurrencias de 1 en cualquier intervalo entero no negativo (el número de ocurrencias de 1 de 1 a n).

Método 1: Para cada dígito, encuentre el lugar tomando el resto de 10 (% 10), luego divida el número original entre 10 para redondear, y luego tome el resto de 10 para obtener diez ... y así sucesivamente

function NumberOf1Between1AndN_Solution(n) {
  // write code here
  var count = 0;
  for (let i = n; i > 0; i--) {
    for (let j = i; j > 0; j = parseInt(j / 10)) {
      //对j/10取整
      if (j % 10 === 1) {
        count++;
      }
    }
  }
  return count;
}

Método dos: método estúpido, convierta de 1 a n en una cadena y cosa juntos para calcular el número de 1

function NumberOf1Between1AndN_Solution(n) {
  // write code here
  var str = "";
  for (let i = 0; i <= n; i++) {
    str += i;
  }
  var res = str.split("").filter((ele) => ele === "1");
  return res.length;
}

5. Organice los enteros al número más pequeño.

Descripción del problema:

Ingrese una matriz de enteros positivos, concatene todos los números en la matriz para formar un número e imprima el más pequeño de todos los números que se pueden concatenar. Por ejemplo, si ingresa la matriz {3, 32, 321}, el número más pequeño que pueden organizar estos tres números es 321323.

Ideas para resolver problemas:

Conecte los números en la matriz para formar el número más pequeño. Ponga 'gran número' atrás y 'decimal' adelante, ¿cómo definir 'gran número' y 'decimal'? Por ejemplo, hay dos números a y b.Si ab> ba, entonces a es un 'número grande' yb es un 'número decimal', que debe organizarse como ba.

Como resultado, esta pregunta se convierte en un problema de clasificación, y los números que pueden formar los números combinados se moverán hacia atrás. Aquí necesitamos definir un método de comparación de la razón. La clasificación de burbujas puede resolver este problema.

function PrintMinNumber(numbers) {
  // write code here
  numbers.sort((a, b) => {
    return "" + a + b > "" + b + a ? 1 : -1; // ab 和 ba ASCII码值大的排在后面
    // return [a,b].join("")-[b,a].join("");
  });
  return numbers.join("");
}

Supongo que te gusta

Origin www.cnblogs.com/muzidaitou/p/12722094.html
Recomendado
Clasificación