Я работаю над проблемой перестановки из GeeksforGeeks. Вот ссылка на вызов: http://www.practice.geeksforgeeks.org/problem-page.php?pid=702Java Permutation Challenge - Slow
Задача состоит в том, чтобы взять массив чисел и для каждого возможного порядка этих чисел в группах по 2 или 3, проверить, делится ли сумма чисел на 3. На конец программы распечатать число групп, которые делятся на 3.
примером может быть ... INT [] массив = {1, 2, 3} должен распечатать 8.
Ниже приведен код, который я использовал для этой задачи. Код работает, но он замедляется. Время выполнения должно быть ниже 1.272, так как я могу сделать этот код быстрее? Или сохранить его от выполнения так много строк?
public static void PG2(int[] array, int l, int r, Counter count){
int newR = r - 1;
int i;
if(l == 2){
String number = String.valueOf(array[0]);
String number2 = String.valueOf(array[1]);
number = number.concat(number2);
int aNumber = Integer.parseInt(number);
count.divBy3(aNumber);
} else {
int temp;
int temp2;
for(i = l; i < r; i++){
temp = array[l];
array[l] = array[i];
array[i] = temp;
PG2(array, l+1, r, count);
temp2 = array[l];
array[l] = array[i];
array[i] = temp2;
}
}
}
public static void PG3(int[] array, int l, int r, Counter count){
int newR = r - 1;
int i;
if(l == 3){
String number = String.valueOf(array[0]);
String number2 = String.valueOf(array[1]);
String number3 = String.valueOf(array[2]);
number = number.concat(number2);
number = number.concat(number3);
int aNumber = Integer.parseInt(number);
count.divBy3(aNumber);
} else {
int temp;
int temp2;
for(i = l; i < r; i++){
temp = array[l];
array[l] = array[i];
array[i] = temp;
PG3(array, l+1, r, count);
temp2 = array[l];
array[l] = array[i];
array[i] = temp2;
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String t = input.readLine();
int T = Integer.parseInt(t);
while(T > 0){
String arrayS = input.readLine();
int ArrayS = Integer.parseInt(arrayS);
int[] newArray = new int[ArrayS];
String arrayElements = input.readLine();
String[] ArrayElements = arrayElements.trim().split("\\s+");
for(int i = 0; i < ArrayS; i++){
int num = Integer.parseInt(ArrayElements[i]);
newArray[i] = num;
}
int total = 0;
Counter count = new Counter();
PG2(newArray, 0, ArrayS, count);
PG3(newArray, 0, ArrayS, count);
System.out.println(count.counter);
T--;
}
}
Вот счетчик класса:
public class Counter {
public int counter;
public void divBy3(int number){
int total = 0;
while(number > 0){
total += number % 10;
number = number/10;
}
if(total % 3 == 0){
this.counter++;
}
}
}
какой код занимает 1,2 секунды? –
Используйте Java 8 stream API, если вы можете использовать выражения. См. Https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html. – amitmah