#java #arrays #algorithm #methods #compare
#java #массивы #алгоритм #методы #Сравнить
Вопрос:
Я хочу сравнить элементы в массиве. Для каждого элемента, начиная слева направо, найдите первое следующее целое число (y) со значением, большим, чем существующее (x), затем найдите следующее первое целое число (z) со значением, меньшим, чем y (слева направо) целое число от него. Если следующие большие и меньшие значения не равны -1, выведите (y — z) на консоль, иначе выведите-1. Мой код выглядит так. Но мой массив 2, 4, 1, 5, 6 и мой вывод -6, -6, -6, -6, -1. Или мой массив 4, 3, 8, 2, 1, но мой вывод -1,-1, -1, -2, -1.
В вашем решении мои входные данные 4, 6, 8, 3, 2, 5, 1 и мои результаты 0, 5, -1, -1, 4, 0,0 но мои выходные данные должны быть для 4: y = 8 и z = 3, так что y — z = 5
и для 6: то же самое, для8 больше нет, и y = -1, z = -1 так что возвращайте -1
, для 3: y = 5 и z = 1, так что y — z = 4
return 4
для 2
одинаково. Следовательно, для массива {4, 6, 8, 3, 2, 5, 1} Я ожидал результата {5, 5, -1, 4, 4, -1, -1}.
public static int[] comparator(int[] arr) {
int y = 0;
int z = 0;
int[] answers = new int[arr.length];
for(int i = 0; i<arr.length; i ) {
for(int j = 0; j<arr.length; j ) {
if(arr[i] < arr[j]) {
y = arr[j];
if(y>arr[j]) {
z = arr[j];
break;
}
answers[i] = z-y;
}
else answers[i] = -1;
}
}
return answers;
}
Ответ №1:
Вы ищете это:
public static int[] comparator(int[] arr) {
int[] answers = new int[arr.length];
for(int i = 0; i <arr.length; i ) {
boolean found = false;
int x = arr[i];
for (int j = i 1; !found amp;amp; j < arr.length - 1; j ) {
int y = arr[j];
if( x < y){
for (int w = j 1; !found amp;amp; w < arr.length; w ){
int z = arr[j 1];
if (y > z) {
answers[i] = (y != -1 amp;amp; z != -1) ? y - z : -1;
found = true;
}
}
}
}
if(!found)
answers[i] = -1;
}
return answers;
}
Для каждого элемента, начиная слева направо,
for(int i = 0; i <arr.length; i )
найдите первое следующее целое число (y) со значением, превышающим существующее (x)
for (int j = i 1; !found amp;amp; j < arr.length - 1; j ) {
int y = arr[j];
if( x < y){
затем найдите следующее первое целое число (z) со значением, меньшим, чем у (слева направо) целое число от него.
for (int w = j 1; !found amp;amp; w < arr.length; w ){
int z = arr[j 1];
if (y > z) {
если следующие большие и меньшие значения не равны -1, выведите (y — z) на консоль, иначе выведите-1.
answers[i] = (y != -1 amp;amp; z != -1) ? y - z : -1;
found = true;
}
}
}
}
if(!found)
answers[i] = -1;
Код должен быть упрощен до:
public static int[] comparator(int[] arr) {
int[] answers = Arrays.stream(arr).map(i -> -1).toArray();
for(int i = 0; i <arr.length; i )
for (int j = i 1; j < arr.length - 1; j )
if (arr[i] < arr[j] amp;amp; isElementFound(arr, answers, i, j))
break;
return answers;
}
private static boolean isElementFound(int[] arr, int[] answers, int i, int j) {
for (int w = j 1; w < arr.length; w )
if (arr[j] > arr[j 1]) {
answers[i] = (arr[j] != -1 amp;amp; arr[j 1] != -1) ? arr[j] - arr[j 1] : -1;
return true;
}
return false;
}
и тестирование:
public static void main(String[] args) {
int[] arr = new int[]{ 4, 6, 8, 3, 2, 5, 1};
System.out.println(Arrays.toString(comparator(arr)));
int[] arr2 = new int[] { 4, 3, 8, 2, 1 };
System.out.println(Arrays.toString(comparator(arr2)));
}
Комментарии:
1. В вашем решении мои входные данные 4, 6, 8, 3, 2, 5, 1 и мои результаты 0, 5, -1, -1, 4, 0,0 но мои выходные данные должны быть для 4: y = 8 и z = 3, так что y — z = 5 и для 6: то же самое,для 8 не больше и y = -1, z = -1, так что возвращайте -1, для 3: y = 5 и z = 1, так что y — z = 4 возвращает 4 для 2 одинаково. Согласно вашему другому решению, мои результаты 5 и 4. Я надеюсь, что смогу объяснить, чего я хочу.
2. Для массива 4, 6, 8, 3, 2, 5 какой массив вы хотите вернуть?
3. для 4, 6, 8, 3, 2, 5, 1; Я хочу вернуться 5, 5, -1, 4, 4, -1, -1