JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N30.
terranum
28 уровень

Кухня(); Задание N30.

Статья из группы Архив info.javarush
участников
Кухня(); Задание N30. - 1 Правила [Одномерные массивы] 30. Даны целые положительные числа а1, а2, ..., an. Найти среди них те, которые являются квадратами некоторого числа m.
Комментарии (28)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
RabenokDmitry
Уровень 21
16 февраля 2015, 22:28
public static int[] searchSquareM(int[] array, int m) {
        m = m * m;
        int countSqrM = 0;
        for (int value : array) {
            if (value == m) {
                array[countSqrM] = value;
                countSqrM++;
            }
        }
        return Arrays.copyOf(array, countSqrM);
    }
Airon
Уровень 34
13 сентября 2014, 17:56
А зачем создавать внутри метода массив, если в конце все равно будете использовать Arrays.copyOf?
public static int[] findM2(int m, int... array) {
    int count = 0;
    for (int x : array)
        if (x * x == m)
            array[count++] = x;
    return Arrays.copyOf(array, count);
}
Docktor91
Уровень 40
13 сентября 2014, 18:30
просто гениально!!)))
zeos
Уровень 30
2 сентября 2014, 13:35

    public static int[] findSquares(int[] array, int m)
    {
        int[] squaresIndex = new int[0];
        int mSquare = m * m;
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] == mSquare)
            {
                int[] tempSquaresIndex = squaresIndex;
                squaresIndex = new int[squaresIndex.length + 1];
                for (int j = 0; j < tempSquaresIndex.length; j++)
                    squaresIndex[j] = tempSquaresIndex[j];
                squaresIndex[squaresIndex.length - 1] = i;
            }
        }
        return squaresIndex;
    }
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:25
Если в массиве 100_000 квадратов, будешь 100_000 инициализировать и перезаписывать?
zeos
Уровень 30
2 сентября 2014, 18:29
Да, это, конечно, проблема.
Можно список использовать, например.

    public static ArrayList<Integer> findSquaresList(ArrayList<Integer> array, int m) {
       ArrayList<Integer> squaresIndex = new ArrayList<Integer>();
        int mSquare = m * m;
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i) == mSquare) {
                squaresIndex.add(i);
            }
        }
        return squaresIndex;
    }
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:37
вы специально, люди, не используете этого, или лень? В первых 10 уроках явно говорится про итерацию:
for (Integer i: list)…
terranum
Уровень 28
2 сентября 2014, 18:37
No no no! Читерить не можна! :)
zeos
Уровень 30
2 сентября 2014, 18:39
Нет, здесь хотелось именно пройтись по индексу, чтобы не вызывать indexOf для каждого найденного квадрата.
zeos
Уровень 30
2 сентября 2014, 18:39
А что тут читерского? Листы нельзя? Пардоньте тогда:)
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:42
нужно не индексы, а сами значения вернуть же
zeos
Уровень 30
2 сентября 2014, 18:47
я целых пять минут, да ещё и два раза думал над этой фразой условия: «Найти среди них те, которые являются квадратами некоторого числа m.» — но не смог однозначно определить, что же требуется. Найти квадрат? Легко: m * m. Проверить, есть ли в массиве квадраты? Тоже легко, один проход, возвращаем boolean. Вернуть массив из одних квадратов? Легко, но зачем?
В общем, я, наверное, не понял условия. Мне видится хоть какой-то смысл в возврате именно индексов.
Думаю, terranum должен уточнить.
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:55
ну раз так:
public static void findSquares(int[] arr, int m) {
    m *= m;
    for (int i : arr) {
        if (i == m) {
            // нашел! хехе
        }
    }
}
terranum
Уровень 28
2 сентября 2014, 19:04
Ну вот и все, весь подвох, в том что задача действительно до боли простая. Признаюсь меня тоже это смутило. Двигаемся дальше кухня(31);
zeos
Уровень 30
2 сентября 2014, 20:04
Вариант:)
Vash_the_Stampede
Уровень 11
2 сентября 2014, 08:54
silh
Уровень 0
2 сентября 2014, 09:31
Вроде как в задании надо найти не все числа, которые являются квадратом какого-либо числа, а числа, которые являются квадратом заданного числа m.
Docktor91
Уровень 40
2 сентября 2014, 12:35
мне больше проверка на целочисленность понравилась) массив то целых чисел)
silh
Уровень 0
2 сентября 2014, 12:53
А еще помоему length в вашем варианте в момент Arrays.copyOf будет на 1 больше, чем нужно.
silh
Уровень 0
2 сентября 2014, 12:55
Не, ну проверяет же он результат вычисления sqrt, так что он проверяет является ли корень целым число.
Docktor91
Уровень 40
2 сентября 2014, 13:25
тьфу ты, показалось, что квадрат, а не корень)
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:22
нет, в самый раз. temp[length++] = i; длина всегда, вроде как, на один больше индекса последнего элемента
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:23
ну в задании написано «некоторого числа m», а не заданного, так что м.б. и так и так, не знаю
terranum
Уровень 28
2 сентября 2014, 18:36
Текстом было бы удобнее, так можно копировать и тестировать. lenght++ — красиво!
Vash_the_Stampede
Уровень 11
2 сентября 2014, 18:39
ок,
public static int[] findSquares(int[] arr) {
    int length = 0; // length of result array
    int[] temp = new int[arr.length]; // array filling by squares from arr
    for (int i : arr) {
        double sqrt = Math.sqrt((double) i);
        if (sqrt - (int) sqrt == 0) { // check if sqrt is integer
            temp[length++] = i;
        }
    }
    return  Arrays.copyOf(temp, length); // return array of squares with required length
}
terranum
Уровень 28
2 сентября 2014, 18:53
(duoble) в Math.sqrt можно опустить, на нас работает неявное приведение.
Стоит все таки передавать некое m в параметр. А иначе логика программы сильно запутанная выходит, не по условию как то.
silh
Уровень 0
2 сентября 2014, 22:01
да, тупанул.