Me parece que el algoritmo / funcionalidad en dos partidos ya, pero yo siempre quería saber lo que era la lógica detrás de él.
Básicamente, hay una lista de artículos y cada uno de ellos tiene un id.
Por ejemplo:
- ITEM_1 tiene id: 1
- ITEM_2 tiene id: 2
- item_3 tiene id: 4
- ITEM_4 tiene id: 8
- item_5 tiene id: 16
- etcétera
El ello se multiplica por dos cada nuevo elemento.
Hay, pues, un número, digamos 4, que indican lo que el elemento actual es. Es este caso que sería item_3
, pero la parte difícil es que el número podría también seleccionar varios elementos a la vez como 7 que es 4 + 2 + 1 ( item_3
, item_2
, item_1
) o 17 que es 16 + 1 ( item_5
, item_1
). Se puede ir muy alto como 16384 si tiene una lista larga y todavía ser muy exactos para las selecciones múltiples.
¿Cómo puedo solucionar este problema?
El algoritmo que se describe básicamente dando salida, donde los 1 de están en la representación binaria del número.
7, su representación binaria es 111
. Hay tres de 1: en la primera, segunda y tercera posición desde la izquierda , respectivamente, por lo que el objeto 1, 2 y 3. Tenga en cuenta que estamos contando desde la izquierda.
Otro ejemplo:
Para el 10, su representación binaria es 1010
. Hay dos 1 de: en la segunda y la cuarta posición de la izquierda , por lo que la salida sería artículos 2 y 4.
Aquí es una implementación en C #.
public static List<int> FindOnes(int number) {
var list = new List<int>();
var binaryString = Convert.ToString(number, 2);
for (int i = 0 ; i < binaryString.Length ; i++) {
if (binaryString[binaryString.Length - i - 1] == '1') {
list.Add(i + 1);
}
}
return list;
}
// usage:
FindOnes(7) // [1,2,3]