Por desgracia, hoy entrevisté a un ingeniero de desarrollo de pruebas de Tencent y mi cara estaba hinchada. Bajé para buscar información y hablar sobre una pregunta de la entrevista.
Números, prefijos y matrices + la combinación de números con un resto de 3 para encontrar la Ley]
Por ejemplo, si solo se requiere que la cadena de 14533254 esté en tiempo O(N), solo puede atravesar un ciclo, y de acuerdo con la ley de los números que pueden ser divisibles por 3 aprendida en la escuela primaria, todos los números pueden ser divisibles. por 3. Así que usa esto para calcular.
La idea es sumar los dígitos a su vez para obtener una matriz, y luego la cadena anterior de 14533254, luego la matriz es {1,5,10,13,16,18,23,27}, y luego cada dígito corresponde a 3, se convierte en {1,2,1,1,1,0,2,0}; encuentra sum0 (el número con resto 0)=2, sum1 (el número con resto 1)=4, sum2 (el número cuyo resto es 2)=2, el resultado del cálculo es res=sum0+C(sum0,2)+C(sum1,2)+C(sum2,2); donde C(sum0,2) es una
combinación Problema numérico, tomemos C(sum1,2) como ejemplo para ilustrar
:
C(sum1,2) significa seleccionar al azar dos {1, 145, 1453, 14533} en el número de sum1, seleccione dos y elimine lo mismo de izquierda a derecha, la parte debajo del cuerpo debe ser divisible por 3; show de
código como a continuación:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str;
while (cin >> str)
{
int len = str.length();
int sum = 0;
int sum0 = 0, sum1 = 0, sum2 = 0;
for (int i = 0; i < len; i++)
{
sum += str[i] - '0';
if (sum%3== 0)
sum0++;
else
if (sum % 3 == 1)
sum1++;
else
sum2++;
}
cout << "结果是:"<<sum0 + sum0 * (sum0 - 1) / 2 + sum1 * (sum1 - 1) / 2 + sum2 * (sum2 - 1) / 2 << endl;
}
return 0;
}
Referencia: https://www.cnblogs.com/zhazhaacmer/p/9441372.html