В качестве примера мы прочесываем перестановки целых чисел 123456789
.Вдохновленный алгоритмом кучи , мы имеем следующее
public static ArrayList<String> comb(char[] seq, int n, ArrayList<String> box){
if(n == 1){
if (isSquare(Integer.valueOf(String.valueOf(seq)))) {
box.add(String.valueOf(seq));
}
} else {
for(int i=0; i<n; i++){
comb(seq,n-1, box);
int j;
if ((n%2)==0) {
j = i;
} else {
j = 0;
}
char temp = seq[n-1];
seq[n-1] = seq[j];
seq[j] = temp;
}
}
return box;
}
В данном случае нас интересует, является ли конкретная перестановка квадратом целого числа.Реализуется
public static boolean isSquare(int n) {
if ((n%10)==2 || (n%10) ==3 || (n%10)==7 || (n%10) == 8) {
return false;
} else if ( (Math.sqrt(n)) % 1 ==0) {
return true;
} else {
return false;
}
}
Однако, чтобы иметь возможность использовать comb
, я должен инициализировать пустой массив вне метода.Что я должен сделать, чтобы не вызывать потребность в глобальной переменной?Я все еще хотел бы получить box
со всеми решениями.Я понимаю, что моя ошибка в параметризации comb
.