Entrevista: Pasantía de reclutamiento de primavera de 2022 Preguntas de la entrevista de Meituan

Ayer hice una serie de preguntas para Meituan y las grabé. Compártelo y escribe tus propias ideas y procesos. Por supuesto, debe haber errores. Si hay errores, puedes comentarme directamente. O si tienes tus propias ideas, espero que puedas compartirlas conmigo y aprender de ellas.

Problema 1: Suma de distancias de Hamming

Xiaomei tiene dos brochetas 01 s, t. Quiere encontrar todas las longitudes de se iguales a ∣ s ∣ |s|ts suma de distancias de Hamming de subcadenas (contiguas). Es decir, quiere saber la distancia de HammingHam ( ti , s ) \text{Ham}(t_i , s)jamón _ _yo,s ) , dondeti t_ityonúmero de dedo iiLa longitud a partir de i caracteres es ∣ s ∣ |s|s subcadena. Para cadenas 01 de igual longituda, b, la definición de la distancia de Hamming entre ellas es:
Ham ( a , b ) = ∑ i = 1 ∣ a ∣ ∣ ai − bi ∣ \text{Ham}(a, b) = \sum_{ yo =1}^{|a|}|a_i-b_i|jamón ( un ,segundo )=yo = 1ununyobyo

La distancia de Hamming entre dos números enteros se refiere al número de posiciones en las que difieren los bits binarios correspondientes de los dos números.

Entrada: para cada conjunto de datos, contiene dos filas de datos, la primera fila es s, la segunda fila es t; 1 ≤ ∣ s ∣ ≤ ∣ t ∣ ≤ 50000 1\le|s|\le|t|\le500001s t 5 0 0 0 0 .

Salida: genera un número entero que representa la suma de las distancias de Hamming

样例输入:
01
00111

样例输出:
3

Mis propios pensamientos: tabla hash

  • Primero use una ventana deslizante con una longitud de para srecorrer toda la cadena t;
  • Use una tabla hash, la clave es la subcadena en la ventana deslizante, el valor es la cantidad de veces que taparece la subcadena en , recorra todo el ttcadena t ;
  • sCalcule la distancia de Hamming entre cada clave en la tabla hash y el número de ocurrencias, y súmelas para obtener el resultado;
def distance(t, s):  # 汉明距离
    n = len(s)
    ans = 0
    for i in range(n):
        if t[i] != s[i]:
            ans += 1
    return ans

while True:
    try:
        s = input()
        t = input()
        ns, nt = len(s), len(t)  # 获得两个字符串的长度
        cntHash = dict()   # 记录不同类型子串的数量的哈希表
        l, r = 0, ns  # 滑动窗口去记录所有的子串数量
        while r <= nt:
            subStr = t[l:r]  # 获得当前子串
            if subStr not in cntHash:
                cntHash[subStr] = 1
            else:  # 如果子串在 哈希表 中
                cntHash[subStr] += 1
            l += 1  # 窗口往后移一格
            r += 1
        distSum = 0  # 汉明距离的和
        # 计算子串之间汉明距离之和
        for ti in cntHash.keys():
            distSum += cntHash[ti] * distance(ti, s)
        print(distSum)
    except: break

Pregunta 2: Diagrama de diamantes

Un rombo es una figura muy elegante: sus lados opuestos son simétricos y sus cuatro lados tienen la misma longitud. Por ejemplo, un cuadrado es un tipo especial de rombo. Para la teoría de grafos, un grafo de diamante se refiere a un anillo formado por un grafo no dirigido, satisfaciendo que el número de puntos sea mayor o igual a 4, en el que se pueden encontrar cuatro puntos diferentes, de modo que las distancias de , , a,b,c,d, a => bson b => ctodas c => digual d => a_

Xiaomei acaba de terminar de aprender la teoría de grafos. Casualmente, creó un gráfico con npuntos my aristas no dirigidas (sin múltiples aristas ni bucles automáticos, conectividad garantizada, es decir, dos puntos cualesquiera se pueden alcanzar entre sí) y quería saber si este gráfico es un gráfico de rombos. (La distancia por defecto entre dos puntos es 1)

Entrada : un entero positivo en la primera línea T, que indica que hay Tgrupos de datos.

Para cada conjunto de datos, dos números enteros positivos en la primera línea n, mrepresentan el número de puntos y aristas del gráfico no dirigido;

La segunda línea mes un entero positivo u_i, la tercera línea mes un entero positivo v_i, lo que indica que hay un borde no dirigido entre y u_i.v_i

Se garantiza que los datos están libres de múltiples bordes y bucles automáticos y el gráfico está conectado. Los números están separados por espacios.

4 ≤ n ≤ m ≤ 1 0 4 , 1 ≤ ui , vi ≤ n , 1 ≤ T ≤ 8 4\le n\le m\le 10^4,1\le u_i,vi\le n,1\le T \el 84nortemetro1 04 ,1tuyo,yo _norte , 1T8

Salida : para cada conjunto de datos, si se trata de un gráfico de diamante, genera una fila Yes; de lo contrario, genera una fila No.

样例输入:
3
8 8
1 3 7 8 5 6 2 4
3 7 8 5 6 2 4 1
9 9
1 3 7 8 5 6 2 4 3
3 7 8 5 6 2 4 1 9
7 7
1 5 6 7 3 4 2
5 6 7 3 4 2 1


样例输出:
Yes
No
No

Esta pregunta no se hizo.

Pregunta 3: Almacén de arroz

La ciudad natal de Xiaomei se encontró con una lluvia torrencial. Con este fin, estableció un almacén de arroz de rescate. Hay carros que traen y se llevan el arroz. Ahora hay una caravana, y cada carro tiene que traer o llevar cierta cantidad de arroz. Suponiendo que el almacén de Xiaomei tiene M kilogramos de arroz al principio, abrirá el almacén cuando pase cierto automóvil, de modo que este automóvil y los vehículos detrás de él puedan ingresar al almacén para transportar o llevarse el arroz. Si un automóvil no puede obtener el arroz que quería, Xiaomei cerrará el almacén por adelantado, y este automóvil y los automóviles detrás de él ya no podrán ingresar al almacén. (Es decir, el almacén de Xiaomei estará abierto a una subcadena continua de la flota y el arroz en el almacén no será negativo)

¿Puedo preguntar cuántos autos pueden ingresar al almacén de Xiaomei como máximo?

Entrada: Para cada conjunto de datos, contiene dos líneas de datos, la primera línea es la cantidad de vehículos en la flota ny el arroz que tiene originalmente el almacén de Xiaomei m, y la segunda línea es la cantidad que el equipo quiere llevarse ( valor negativo) o entregar (valor positivo) arroz ai a_iayo, los números están separados por espacios.

1 ≤ n ≤ 50000 , − 1 0 9 ≤ ai ≤ 1 0 9 , 0 ≤ m ≤ 1 0 9 1\and n \and 50000, -10^9\and a_i\and10^9,0\and m\le 10^91norte5 0 0 0 0 ,1 09ayo1 09 ,0metro1 09

Salida: genera un número entero que indica cuántos vehículos entran como máximo (la subcadena continua más larga).

样例输入:
4 10
-16 2 -6 8

样例输出:
3

Mi línea de pensamiento:

  • Use dos variables para simular la entrada de vehículos uno por uno, restregistre el resto del almacén actual (valor inicial m), maxCarregistre los vehículos que han ingresado al almacén actualmente, recorra la matriz desde el principio ay ocurrirán las siguientes tres situaciones cuando el próximo vehículo entra:
    • El excedente del almacén todavía no es negativo, es decir rest + a[i] >= 0, let maxCar := maxCar + 1;
    • Si el almacén actual no es suficiente para que lo recoja el próximo vehículo, es decir rest + a[i] < 0, el vehículo que se encuentra frente a la posición actual no puede ingresar, hay dos situaciones en este momento:
      • Si la cantidad de arroz que quiere llevar el carro que actualmente va a entrar al almacén es menor o igual a la cantidad inicial del almacén, es decir, m + a[i] >= 0entonces este carro puede entrar, ordenar rest = m + a[i], maxCar = 1;
      • De lo contrario, la cantidad de arroz que este auto quiere traer es mayor que la cantidad inicial del almacén, es decir, m + a[i] < 0entonces no se puede permitir que entre, omita este auto y rest = m, maxCar = 0comience desde el principio;
while True:
    try:
        n, m = map(int, input().split())  # 第一行:车队数量,仓库大米存量
        a = list(map(int, input().split()))  # 车队预计要运输的大米
        n = len(a)
        maxCar = 0  # 
        rest = m
        for i in range(n):
            rest += a[i]
            if rest >= 0:
                maxCar += 1
            elif m + a[i] >= 0:
                rest = m + a[i]
                maxCar = 1
            else:
                rest = m
                maxCar = 0
        print(maxCar)
    except: break

Pregunta 4: Compre jugo

¡La clase de Xiaomei está organizando una fiesta de clase! El maestro le dio una tarea a Xiaomei: comprar jugos para la fiesta.

Xiaomei vino al supermercado y descubrió que hay un total nde bebidas de jugo diferentes en el supermercado, y los tipos están marcados como 1 , 2 , 3 , ... , n 1,2,3,\dots,n1 ,2 ,3 ,,n , cada trago tiene un manjarai a_iayoai a_iayoCuanto más grande es, mejor es la bebida. Sin embargo, dado que algunas bebidas de jugo pueden tener un sabor extraño, ai a_iayoPuede ser menor o igual a 0.

Como no conocía el gusto de cada estudiante, Xiaomei compró una botella de cada bebida. En ese momento, Xiaomei estaba pensando: ¿Puedes encontrar un par que l, rsatisfaga 1 ≤ l ≤ r ≤ n 1\le l\le r \le n1yorn , y no satisface[ l , r ] = [ 1 , n ] [l,r]=[1,n][ yo ,r ]=[ 1 ,n ] (es decir, seleccionar todo), tal que[ l , r ] [l,r][ yo ,r ] Compro una botella de cada bebida de esta categoría, y la suma de su delicadeza es mayor o igual a la suma de la delicadeza de comprar una botella de cada bebida?

Entrada: un entero positivo en la primera línea T, que indica que hay Tgrupos de datos.

Para cada conjunto de datos, la primera línea es un número entero positivo n; la segunda línea nes un número entero a 1, a 2, …, an a_1,a_2,\dots,a_na1,a2,,an

1 ≤ T ≤ 5 , 3 ≤ norte ≤ 5 × 1 0 4 , − 100 ≤ ai ≤ 100 1\y T\y 5, 3\y n\y 5\por 10^4, -100\y a_i\y 1001T5 ,3norte5×1 04 ,1 0 0ayo1 0 0

Salida: para cada conjunto de datos, si se encuentra, salida Yes; de lo contrario, salida No.

样例
2
4
1 2 3 4
3
-5 5 -5

答案
No
Yes

Mi línea de pensamiento:

  • Acumule ade izquierda a derecha y acumule de derecha a izquierda en
  • Entonces, siempre que haya un número negativo o 0, significa que existe un método de compra de este tipo descrito en el título.
T = int(input())  # 有 T 组数据
for _ in range(T):
    n = int(input())
    a = list(map(int, input().split()))
    s = 0
    res = "No"
    for i in range(n):
        s += a[i]
        if s <= 0:
            res = "Yes"
            break
    s = 0
    if res == "No":
        for i in range(n-1, -1, -1):
            s += a[i]
            if s <= 0:
                res = "Yes"
                break
    print(res)

Supongo que te gusta

Origin blog.csdn.net/weixin_39679367/article/details/124529682
Recomendado
Clasificación