Siento un poco de mal humor allí. No hago esto por puntos. Lo hago porque lo disfruto. Te di mucho y pensé que podrías llevarlo por tu cuenta. De todos modos, este es un lugar donde completos extraños ayudan a completar extraños.
Aquí es un código, con los resultados de las pruebas siguientes:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ResolvingAlgo {
public static Character[] resolver(Character[] objects, int R) {
//calculate frequency of each element
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (Character c : objects) {
Integer freq = map.get(c);
map.put(c, (freq == null) ? 1 : freq + 1);
}
//count elements with frequency R
List<Character> pillars = new ArrayList<Character>();
for (Character c : map.keySet()) {
int freq = map.get(c);
if (R == freq) {
pillars.add(c);
} else if (objects.length/R < freq) {
return null;
}
}
//output array
Character output[] = new Character[objects.length];
//load the pillars R+1 apart
int skip = (pillars.size()<R)?R:R+1;
for (Character c : pillars) {
int index = 0;
for (int out=index; out<output.length; out++) {
if (output[out] == null) {
break;
}
index++;
}
for (int i = R; i > 0; i--) {
output[index] = c;
index += skip;
}
map.remove(c);
}//pillars
//add remainders
while (!map.isEmpty()) {
int index = 0;
Character keyset[] = Arrays.copyOf(map.keySet().toArray(new Character[0]), map.size());
for (Character c : keyset) {
for (int out = index; out < output.length; out++) {
if (null == output[out]) {
break;
}
index++;
}
output[index] = c;
int freq = map.get(c);
if (freq <= 1) {
map.remove(c);
} else {
map.put(c, freq - 1);
}
}//for keyset
}//while
return output;
}//resolver
public static void main(String... args) {
Character[][] input = {
{'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'},
{'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'k'},
{'a', 'a', 'a', 'b', 'c', 'd', 'd', 'd', 'k'},
{'a', 'b', 'd', 'c', 'a', 'd', 'k', 'a', 'd', 'a', 'a'},
{'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd'},
{'a', 'b', 'c', 'd', 'e', 'f', 'a', 'b', 'c', 'd', 'e', 'f'},
{'a','b','c','d','a','b','c','d'}
};
for(Character in[]: input)
System.out.println(Arrays.toString(resolver(in, 3)));
}
}
Resultado de la prueba:
[d, b, c, a, d, b, c, a, d, b, c, a]
[b, c, a, d, b, c, a, k, b, c, a, d]
[d, a, b, d, a, c, d, a, k]
null
[b, c, d, b, c, a, b, c, d, a, a, a]
[f, d, e, b, c, a, f, d, e, b, c, a]
[d, b, c, a, d, b, c, a]
@ EvgenyKluev- Aunque estoy de acuerdo que su condición es suficiente para que haya ningún orden, ¿es necesario? Además, ¿podría utilizar su enfoque para producir un pedido cuando existe? – templatetypedef
@ EvgenyKluev- No estoy seguro de entender lo que quieres decir. No veo cómo ordenar la matriz puede producir una solución de trabajo cuando hay una, ni veo por qué ordenar la matriz y observar que no hay demasiadas copias de un elemento garantiza que hay una forma de organizar los elementos. ¿Puedes elaborar? – templatetypedef
@templatetypedef, he entendido mal la pregunta. Lo siento. –