L'idée de ne pas avoir fondamentalement de valeurs répétées dans le tableau avec des valeurs similaires.
Exemple de tableau contient les valeurs
input = [1,2,2,2,2,3,4,5,6,7,8,9]<br/>
Production attendue pour avoir quelque chose
likeoutput = [1,2,3,2,4,2,5,2,6,2,7,8,9]<br/>
J'ai essayé de mettre cela dans une boucle for avec où il vérifie avec l'élément suivant et si c'est le même, échange les valeurs. Le problème est quand j'ai des valeurs similaires continues.
Cette proposition présente
[1, 1, 1, 1, 3, 3]
), Comment ça marche?
Comme exemple, je prends ce tableau:
[1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]
Créez un objet avec le nombre d'éléments, rangez-le avec l'élément en tant que clé.
length = { "1": 1, "2": 4, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1 }
- Sélectionnez la propriété avec la plus grande valeur:
length[2] = 4
Créez un nouveau tableau avec la longueur de la valeur précédente et complétez-le avec des tableaux vides.
output = [[], [], [], [], []]
- Vérifiez si un réseau étendu est possible. Sinon, retournez.
Définissez
k
pour la clé de la plus grande valeur d'une propriété.k = '2'
- En vérité, continuez. Sinon, passez à 11.
Réglez
l
à la valeur de lalength[k]
.l = 4
- Iterate sur
l
et appuyez surk
jusqu'à la fin du tableau avec l'indice dei % outputLength
. Augmenteri
.- Supprimer la propriété
k
.- Procéder avec 5.
Renvoie le tableau de
output
plat.output first then continued array 0: 2 1 6 array 1: 2 3 7 array 2: 2 4 8 array 3: 2 5 9 return: 2 1 6 2 3 7 2 4 8 2 5 9 distance | | | | is equal
function spread(input) { function findMaxKey() { var max = 0, key; Object.keys(length).forEach(function (k) { if (length[k] > max) { max = length[k]; key = k; } }); return key; } var length = input.reduce(function (r, a) { r[a] = (r[a] || 0) + 1; return r; }, {}), i = 0, k = findMaxKey(), l, outputLength = length[k], output = Array.apply(Array, { length: outputLength }).map(function () { return []; }); if (input.length - outputLength < outputLength - 1 ) { return; // no spread possible } while (k = findMaxKey()) { l = length[k]; while (l--) { output[i % outputLength].push(k); i++; } delete length[k]; } return output.reduce(function (r, a) { return r.concat(a) }, []); } console.log(spread([1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9])); console.log(spread([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2])); console.log(spread([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])); console.log(spread([1, 1, 1, 1, 3, 3])); console.log(spread([1, 1, 3]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Peut-être que cela pourrait vous aider:
for(var i = 1; i < input.length; i++) { if(input[i-1] == input[i]) { var j = i; while(j < input.length && input[j] == input[i]) { j++; } var el = input[j]; input[j] = input[i]; input[i] = el; } }