J'essaie de trouver la façon dont quelle est la bonne approche pour y parvenir: Imaginez que nous avons un groupe de bits comme suit:
00010
3 Réponses :
Comme vous pouvez le voir, vous ne pouvez pas le faire à l'aide d'un seul ensemble pour stocker des résultats intermédiaires, car vous devez distinguer entre 3 états pour chaque bit: Ne jamais définir, définir une fois et définir plus d'une fois.
Donc, vous avez besoin au moins 2 résultats intermédiaires. Par exemple, vous pouvez suivre des bits définis au moins une fois et les bits définis plus d'une fois séparément: p> ou en utilisant bitset code> s (il ne semble pas le cas Élégant, car
bitset code> n'est pas immutable): p>
J'essayais la même chose avec exacormeOnce code>, plutôt que
ATLESONCE code>, mais votre solution est définitivement plus propre
Remplacer int code> par
bitset code> ou supposez simplement un modèle abstrait où
int code> s est arbitrairement long.
Vous pouvez utiliser l'approche une fois deux fois:
une fois que code> définit
- ajoutez-le au
deux fois code> SET LI>
ul> li>
- sinon
- ajoutez-le au
une fois code> SET LI>
ul> li>
ul> li>
ul> li>
- retour
une fois code> - deux fois code> li>
ul> Le truc ici est qu'il peut être effectué en parallèle: p>
- pour chaque collection
C code>
-
deux fois code>: = deux fois code> ou ( une fois code> et c code>) li>
-
une fois code>: = une fois code> ou c code> li>
ul> li>
ul> La mise en œuvre pourrait ressembler à: p> xxx pré> p>
int length = 5; int count[] = new int[length]; for (i = 0; i < bitset.length(); i++) { int value = bitset[i]; unsigned int count = 0; for (int j = 0; j < length; j++) { // until all bits are zero if ((value & 1) == 1) // check lower bit count[j]++; value >>= 1; // shift bits, removing lower bit } } int number = 00000; for (int k = 0; k < 5; k++) { if (count[k] == 1) number = number | 1; number >>= 1; } number is desired answer
Je suis très curieux de la réponse la plus courte possible à cela. Je peux penser à plusieurs façons de y parvenir, mais j'essaie de formuler une opération à une doublure.
Si vous connaissez la série à l'avance: Transposez-la et recherchez une puissance de 2: cela indiquera que la (s) colonne (s) n'a qu'un seul bit.