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 s
e iguales a ∣ s ∣ |s|t
∣ s ∣ 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 = 1∑∣ un ∣∣ unyo−byo∣
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|\le500001≤∣ s ∣≤∣ 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
s
recorrer toda la cadenat
; - Use una tabla hash, la clave es la subcadena en la ventana deslizante, el valor es la cantidad de veces que
t
aparece la subcadena en , recorra todo el ttcadena t ; s
Calcule 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 => b
son b => c
todas c => d
igual d => a
_
Xiaomei acaba de terminar de aprender la teoría de grafos. Casualmente, creó un gráfico con n
puntos m
y 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 T
grupos de datos.
Para cada conjunto de datos, dos números enteros positivos en la primera línea n, m
representan el número de puntos y aristas del gráfico no dirigido;
La segunda línea m
es un entero positivo u_i
, la tercera línea m
es 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 84≤norte≤metro≤1 04 ,1≤tuyo,yo _≤norte , 1≤T≤8
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 n
y 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^91≤norte≤5 0 0 0 0 ,−1 09≤ayo≤1 09 ,0≤metro≤1 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,
rest
registre el resto del almacén actual (valor inicialm
),maxCar
registre los vehículos que han ingresado al almacén actualmente, recorra la matriz desde el principioa
y 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
, letmaxCar := 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] >= 0
entonces este carro puede entrar, ordenarrest = 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] < 0
entonces no se puede permitir que entre, omita este auto yrest = m, maxCar = 0
comience desde el principio;
- 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,
- El excedente del almacén todavía no es negativo, es decir
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 n
de 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_iayo。ai 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, r
satisfaga 1 ≤ l ≤ r ≤ n 1\le l\le r \le n1≤yo≤r≤n , 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 T
grupos de datos.
Para cada conjunto de datos, la primera línea es un número entero positivo n
; la segunda línea n
es 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 1001≤T≤5 ,3≤norte≤5×1 04 ,− 1 0 0≤ayo≤1 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
a
de 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)