Análisis de ideas de resolución de problemas de Leetcode (veinticuatro) 168-177

  1. Nombre de la tabla de Excel
    Dado un número entero positivo, devuelve el nombre de la columna correspondiente en la tabla de Excel.

Conversión base

class Solution {
    
    
public:
    string convertToTitle(int n) 
    {
    
    
        string ans = "";
        while (n > 0)
        {
    
    
            n -= 1;
            ans.push_back('A' + (n % 26));
            n /= 26;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};


  1. Mayoría de elementos
    Dada una matriz de tamaño n, encuentre la mayoría de los elementos en ella. La mayoría de los elementos se refieren a elementos que aparecen más de ⌊ n / 2 ⌋ en la matriz.
    Puede asumir que la matriz no está vacía y que siempre habrá una mayoría de elementos en una matriz determinada.

Es fácil de resolver con la tabla hash

class Solution {
    
    
public:
    int majorityElement(vector<int>& nums) 
    {
    
    
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++)
        {
    
    
            map[nums[i]]++;
            if (map[nums[i]] > nums.size() / 2)
            {
    
    
                return nums[i];
            }
        }
        return -1;
    }
};

Después de clasificar, el medio debe ser la mayoría.

class Solution {
    
    
public:
    int majorityElement(vector<int>& nums) {
    
    
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};

Otra forma de pensar es establecer otros números en -1 y la moda en 1, entonces la suma debe ser mayor que 0. Entonces podemos mantener un candidato en modo candidato y su recuento de ocurrencias. Inicialmente, el candidato puede ser cualquier valor, el recuento es 0;
recorremos todos los elementos en los números de la matriz, para cada elemento x, antes de juzgar x, si el valor del recuento es 0, primero asignamos el valor de x al candidato, y luego Juez x:
si x es igual al candidato, entonces el valor del contador se incrementa en 1;
si x no es igual al candidato, entonces el valor del contador se reduce en 1.
Una vez que se completa el recorrido, el candidato es el modo de toda la matriz.

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = -1;
        int count = 0;
        for (int num : nums) {
            if (num == candidate)
                ++count;
            else if (--count < 0) {
                candidate = num;
                count = 1;
            }
        }
        return candidate;
    }
};

  1. Número de serie de la columna de la tabla de Excel
    Dado un nombre de columna en una tabla de Excel, devuelve el número de serie de la columna correspondiente.

Demasiado simple para decir

class Solution {
    
    
public:
    int titleToNumber(string s) {
    
    
        int ret = 0;
        for (auto c : s)
        {
    
    
            ret = ret * 26 + (c - 'A' + 1);
        }
        return ret;
    }
};
  1. Cero después del factorial
    Dado un número entero n, devuelve n! El número de ceros en la mantisa del resultado.
    El número de 0 en el factorial depende del número de 5 y 2. Debido a que hay tantos 2, en realidad puedes mirar el número de 5.
class Solution {
    
    
public:
    int trailingZeroes(int n) {
    
    
        int five = 0;
        while(n >= 5){
    
    
            five += n/5;
            n/=5;
        }
        return five;
    }
};
  1. Iterador de
    búsqueda de árbol binario Implemente un iterador de árbol de búsqueda binaria. Inicializará el iterador con el nodo raíz del árbol de búsqueda binaria.
    Llamar a next () devolverá el siguiente número más pequeño en el árbol de búsqueda binaria.

Esta pregunta es en realidad una variante del recorrido en orden. Se necesita una pila para guardar la posición actual y luego continúa encontrando el siguiente nodo más a la izquierda después de abrir la pila.

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
    
    
    stack<TreeNode *> m_stack;
public:
    BSTIterator(TreeNode* root) {
    
    
        while (root)
        {
    
    
            m_stack.push(root);
            root = root->left;
        }
    }
    
    /** @return the next smallest number */
    int next() {
    
    
        int ret = m_stack.top()->val;
        TreeNode *tmp = m_stack.top()->right;
        m_stack.pop();        
        while (tmp)
        {
    
    
            m_stack.push(tmp);
            tmp = tmp->left;
        }
        return ret;
    }
    
    /** @return whether we have a next smallest number */
    bool hasNext() {
    
    
        return !m_stack.empty();
    }
};

/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator* obj = new BSTIterator(root);
 * int param_1 = obj->next();
 * bool param_2 = obj->hasNext();
 */
  1. Juego de mazmorras

Esta pregunta es similar a la cuadrícula anterior, que se resuelve mediante programación dinámica. La diferencia es que esta pregunta debe considerar que el volumen de sangre no puede ser inferior a 0, por lo que desde el final hasta el punto de partida es la solución correcta.

class Solution {
    
    
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
    
    
        //  m 为行数,n 为列数
        int m = dungeon.size();
        int n = dungeon[0].size();
        
        //  初始化一个数组用于更新需要被扣掉生命值(以下简称生命值)
        vector<int> line(n, INT32_MIN);
        line[n - 1] = 0;
        
        //  从最后一行的最右边开始更新生命值
        for (int i = m - 1; i >= 0; i--) {
    
    
            line[n - 1] += dungeon[i][n - 1];
            line[n - 1] = (line[n - 1] > 0) ? 0 : line[n - 1];

            for (int j = n - 2; j >= 0; j--) {
    
    
                line[j] = max(line[j], line[j + 1]) + dungeon[i][j];
                line[j] = (line[j] > 0) ? 0 : line[j];
            }
        }
        return 1 - line[0];
    }
};


  1. Combine las dos tablas y
    escriba una consulta SQL que cumpla con la condición: independientemente de si la persona tiene información de dirección, debe proporcionar información de la persona en función de las dos tablas anteriores

El punto de investigación es la consulta conjunta de varias tablas. La memoria principal es
1) combinación izquierda, el resultado de la combinación conserva todos los datos de la tabla izquierda
2) combinación derecha, el resultado de la combinación conserva todos los datos de la tabla derecha
3) combinación interna (Inner join), tome los datos comunes de las dos tablas.

# Write your MySQL query statement below
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId;
  1. El segundo salario más alto
    Escriba una consulta SQL para obtener el segundo salario más alto (Salario) en la tabla Empleado.

Ordene primero y luego consulte, use IFNULL para evitar que el segundo más alto sea NULL

# Write your MySQL query statement below
SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary


  1. La enésima variable personalizada de salario más alto
    realiza la clasificación de los datos en orden descendente de salario, y el mismo salario y el mismo nombre no se saltan grados, es decir, después de 3000, 2000, 2000 y 1000 se clasifican 1, 2, 2 y 3;
    para tablas temporales con información de clasificación Segunda selección, obtenga el
    salario clasificado N ; debido a que puede haber más de un registro con el rango salarial N, use distinto para eliminar el duplicado
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      SELECT 
          DISTINCT salary 
      FROM 
          (SELECT 
                salary, @r:=IF(@p=salary, @r, @r+1) AS rnk,  @p:= salary 
            FROM  
                employee, (SELECT @r:=0, @p:=NULL)init 
            ORDER BY 
                salary DESC) tmp
      WHERE rnk = N
  );
END


Supongo que te gusta

Origin blog.csdn.net/u013354486/article/details/105880359
Recomendado
Clasificación