Я ощущаю немного угрюмости. Я не делаю этого для очков. Я делаю это, потому что мне это нравится. Я много тебе дала и подумала, что ты сможешь продолжить свое дело. Во всяком случае, это место, где полные незнакомцы помогают совершенно незнакомым людям.
Вот код, с результатами испытаний следующих:
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)));
}
}
Результат теста:
[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- Хотя я согласен, что ваше состояние достаточно для там быть не упорядоченность, нужно ли это? Кроме того, вы могли бы использовать свой подход для создания заказа, если он существует? – templatetypedef
@ Евгений Клюев. Я не уверен, что понимаю, что вы имеете в виду. Я не вижу, как сортировка массива может создать рабочее решение, когда оно есть, и я не вижу, почему сортировка массива и замечание о том, что не так много копий элемента дает гарантию, что существует способ организации элементы. Можете ли вы уточнить? – templatetypedef
@templatetypedef, я неправильно понял вопрос. Сожалею. –