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("");
}