Вопрос по массивам Java
В данный момент решаю задачи с codewards. Помогите, пожалуйста, с решением, не понимаю что делаю не так.
Дано 2 массива int (Кстати мой наставник, сказал не использовать коллекции в решении, так как нужно сначала научиться работать сложно, а потом переходить на простые решения). Например, в каждом по 8 чисел. Нужно написать программу, которая будет брать число из первого массива, возводить его в квадрат и искать результат во втором массиве и так 8 раз. Если результат возведения найден - вернуть true; Нет? - false. Я написал 3 вариации решения:
- Просто сложил все числа второго массива, сложил квадраты чисел первого массива, проверил на равенство и вуаля, все получилось. НО! codewards данное решение не принял, видимо потому что оно не универсальное. Выглядит решение так:
class Main {
public static void main(String[] args) {
int[] a = {121, 144, 19, 161, 19, 144, 19, 11};
int[] b = {121, 14641, 20736, 361, 25921, 361, 20736, 361};
System.out.println(comp(a,b));
}
public static boolean comp(int [] a, int[] b){
boolean result = false;
int result1=0;
int result2=0;
if(a.length == b.length && a.length!=0){
for(int i=0;i<a.length;i++){
int square = (int) Math.pow(a[i],2);
result1 = result1+square;
result2 = result2+b[i];
}
}
else result=false;
if(result1==result2){
result = true;
}else result=false;
return result;
}
}
Данное решение, как я уже говорил, не прошло.
Вот другое решение. НО! Почему то, при этом решении IDEA, всегда выводит true. Пробуя поменять любое число в массиве, все равно выводится true, помогите пожалуйста, уважаемые (надеюсь) будущие коллеги!
package com.company;
import java.util.ArrayList;
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] a = {121, 144, 19, 161, 19, 144, 19, 11};
int[] b = {121, 14641, 20736, 361, 25921, 361, 20736, 361};
System.out.println(haveAllPows(a, b));
}
public static boolean haveAllPows(int[] a, int[] b) {
boolean result = false;
if (a.length == b.length && a.length != 0) {
sort(a);
sort(b);
for (int i = 0; i < a.length; i++) {
int square = (int) Math.pow(a[i],2);
int other = b[i];
System.out.println(square);
System.out.println(other);
if (other == square){
result=true;
}
else result=false;
}
}
else result = false;
return result;
}
public static int[] sort(int[] a) {
boolean sorted = false;
int temp;
while (!sorted) {
sorted = true;
for (int i = 0; i < a.length - 1; i++) {
if (a[i] > a[i + 1]) {
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
sorted = false;
}
}
System.out.println(Arrays.toString(a));
}
return a;
}
}
Выводы на экран, делал для того, что бы понять, что с чем сравнивает компьютер. И ничего не понятно. Заранее спасибо!
Ответы (2 шт):
В первом случае могут просто "удачно" попасться элементы. Например a = {3, 4}; b = {5,0}. Сумма квадратов a и сумма b совпадут, но нужных квадратов там не будет.
Во втором случае у вас последнее сравнение будет результатом, проигнорировав все остальные.
И задание у вас изложено не совсем понятно, чтобы давать более подробные комментарии:
Нужно чтобы второй массив содержал квадраты первого. Т.е. a = {1,2,1};b = {1,4,9} —> True.
Или чтобы он состоял из них?
Перебор в сложности. Как впрочем и всегда... Разумеется, здесь коллекция типа сет может все упростить, но раз вы по условию коллекции использовать не хотите, то можно и без них
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] a = {121, 144, 19, 161, 19, 144, 19, 11};
int[] b = {121, 14641, 20736, 361, 25921, 361, 20736, 361};
System.out.println(comp(a, b));
}
private static boolean comp(int[] arr1, int[] arr2) {
return Arrays.stream(arr1).allMatch(value -> contains(arr2, value*value));
}
private static boolean contains(int[] arr, int numb) {
return Arrays.stream(arr).anyMatch(value -> value==numb);
}
}