Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/48: Рейтинг темы: голосов - 48, средняя оценка - 4.77
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13

Задача на собеседовании

01.07.2016, 19:13. Показов 10448. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Являюсь начинающим разработчиком и пытался проходить одно собеседование на позиции стажера Junior Java и после моего предложенного решения мне отказали.
Хотел бы все-таки попытаться решить данную задачу или как минимум то решение, которое хотели от меня интервьювер.

Задча была следующей. Написатть метод merge, который принимаем в качстве параметров два ArrayList a и b.
Данные коллекции можно представить в виде a = [a1, a2, a3, ....] и b = [b1, b2, b3, ...]. По результату выполеения программы
надо получить в коллекции а следующее a= [a1, b1, a2, b2, a3, b3.....]. При этом необходимо написать метод, который
экономный к процессорному времени и памяти.

Я предложил следующий вариант решения задачи:
Java
1
2
3
4
5
6
7
8
9
10
    static void merge(ArrayList a, ArrayList b) {
    int size = b.size();
    for (int i=0; i<size; i++){
    a.add(null);
    }
    for (int i=size; i>0; i--){
    a.set((i<<1)-1,b.get(i-1));
    a.set((i<<1)-2,a.get(i-1));
    }
    }
подскажите как можно сделать лучше?? Хочется попробовать отпрофилировать метод )) но не с чем сравнивать )
Учитывая, что в принципе знаю внутреннюю реализацию этой коллекции, постарался избежать ситуаций копирования массива, который
справа от вставляемого элемента и начал задачу с конца, и по большей части полагаясь на не ресурсоемком методе get.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2016, 19:13
Ответы с готовыми решениями:

Задача на собеседовании
Доброго времени суток, написал задачу с собеседования прошу Вас посмотреть, и указать мои ошибки- недостатки. Код написан в NetBeans вложил...

Задание на собеседовании - в чём ошибка?
Вот что попалось: Отпишите кто может. Всё-таки интересно какие же тут есть ошибки.

Для работающих Java-программистом. Вопросы на собеседовании
Народ (кто работает или уже пытался устроиться), можете поделиться вопросами, которые вам задавал работодатель на собеседовании?

41
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
01.07.2016, 19:20
а ты точно знаешь джаву?
ну просто глядя на ЭТО, закрадываются сомнения
1
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 19:44  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
а ты точно знаешь джаву?
ну просто глядя на ЭТО, закрадываются сомнения
Спасибо за ответ по теме.

Добавлено через 20 минут
а что именно вас смущает? статичный метод, отсутствие generic'ов, не правильная работа с коллекцией? Зачем отвечать таким образом, что возникает больше вопросов. Если бы я полагался на свои знания, то в принципе не писал бы тут вопроса. Поэтому очень классно, что на форуме есть люди, которые знают джаву и могут помочь с исчерпывающим ответом даже на глупый вопрос.
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
01.07.2016, 20:01
Вообще я думаю что это дебильное задание для собеседования, но не суть.
Посмотри в сорсах как реализован метод add, обрати внимание на вызов ensureCapacity
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 20:03  [ТС]
Цитата Сообщение от ninjacut Посмотреть сообщение
Вообще я думаю что это дебильное задание для собеседования, но не суть.
Посмотри в сорсах как реализован метод add, обрати внимание на вызов ensureCapacity
а по-мойму понял идею
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
01.07.2016, 20:08
brainleo, не, так ты его вызываешь и все равно заполняешь null-ями. Суть в том что без вызова этого метода, массив будет копироваться два раза (может 3, но вроде нет) а если вызвать этот метод, размер увеличится до нужного и скопируется в новый только один раз. Соответственно если размер листа 100 тысяч то копировать 1 или 2 раза это большая разница.
1
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 20:17  [ТС]
ninjacut, а может подскажешь, для проверки верно ли понял.. при начальной загрузке например там лежит массив с 10 элементами, и когда все ячейки заполнены, то создается массив новый с 11 элементами? Когда писал, думал что массив автоматически как миниму в 1.5 раза увеличивается, как количество бэкитов в HashSet....?
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
01.07.2016, 20:21
brainleo, Так вроде и есть, но если в 1.5 раза то оно же будет 2 раза увеличиваться, не? Если у тебя 2 массива по 10, тебе нужен первый в 20, он сначала увеличится до 16 или 15, потом до 30+. А так ты сразу делаешь его 20+.
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
01.07.2016, 20:31
Лучший ответ Сообщение было отмечено vxg как решение

Решение

brainleo,
1. Создать новый лист с размером a + b
2. Переписать элементы через один из а и b.
1
64 / 64 / 26
Регистрация: 07.01.2016
Сообщений: 374
01.07.2016, 20:59
Или вставляй в Лист а из Листа b по нечетным индексам
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 21:38  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
1. Создать новый лист с размером a + b
2. Переписать элементы через один из а и b.
окей, попробую засечь время на выполнение такой процедуры )
однако там было еще одно условие - не ресурсоемкое, а тут создается промежуточная коллекция...
т.е. надо в первый передаваемый массив сделать желаемую структуру...

Добавлено через 16 минут
Цитата Сообщение от DavidKarchikyan Посмотреть сообщение
Или вставляй в Лист а из Листа b по нечетным индексам
у вас в таком случае при каждой вставке будет переписываться часть массива, который справа находится, явно это не очень экономит время процессора, поэтому я делал это с конца массива, что как минимум я думал будет обходить это несчастное лишнее копирование
0
64 / 64 / 26
Регистрация: 07.01.2016
Сообщений: 374
01.07.2016, 21:50
brainleo,
С конца даже больше, так как придется копировать еще и данные которые с b ввел
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 21:53  [ТС]
Цитата Сообщение от DavidKarchikyan Посмотреть сообщение
С конца с начала то же кол-во копирований)
Преимущества ArrayList: в возможности доступа к произвольному элементу по индексу за постоянное время (так как это массив), минимум накладных расходов при хранении такого списка, вставка в конец списка в среднем производится так же за постоянное время. В среднем потому, что массив имеет определенный начальный размер n (в коде это параметр capacity), по умолчанию n = 10, при записи n+1 элемента, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент. В итоге получаем, что при добавлении элемента при необходимости расширения массива, время добавления будет значительно больше, нежели при записи элемента в готовую пустую ячейку. Тем не менее, в среднем время вставки элемента в конец списка является постоянным. Удаление последнего элемента происходит за константное время. Недостатки ArrayList проявляются при вставке/удалении элемента в середине списка — это взывает перезапись всех элементов размещенных «правее» в списке на одну позицию влево, кроме того, при удалении элементов размер массива не уменьшается, до явного вызова метода trimToSize().

https://habrahabr.ru/post/162017/
0
64 / 64 / 26
Регистрация: 07.01.2016
Сообщений: 374
01.07.2016, 21:58
brainleo,
Я конечно постараюсь доходчиво объяснить. КЛЮЧЕВОЕ СЛОВО
Цитата Сообщение от brainleo Посмотреть сообщение
конец списка
. А не с конца списка, так как из b копируется не только в конец.
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 22:27  [ТС]
Цитата Сообщение от DavidKarchikyan Посмотреть сообщение
Я конечно постараюсь доходчиво объяснить. КЛЮЧЕВОЕ СЛОВО
не вопрос, возможно доходчиво и не понимаю

если не сложно, набросайте код, я реально профилировщиком оценю

Добавлено через 21 минуту
я оттестировал два варинта

1 вариант который я предлагал - среднее время на выполнении 12-13 мс на коллекциях каждая в 1 млн элементов

после коррекции с учетом рекомендаций ninjacut в таком виде:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
     static void merge1(ArrayList a, ArrayList b) {
        
        int size = b.size();
        a.ensureCapacity(size*2);
        for (int i=0; i<size; i++){
            a.add(null);
        }
        
        for (int i=b.size(); i>0; i--){
            a.set((i<<1)-1,b.get(i-1));
            a.set((i<<1)-2,a.get(i-1));
        }
    }
время составило 3-4 мс

уже что-то есть )) спасибо большое
0
64 / 64 / 26
Регистрация: 07.01.2016
Сообщений: 374
01.07.2016, 22:39
brainleo,
i
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mport java.util.ArrayList;
 
public class Main {
    public static void main(String args[]) {
 
        ArrayList<Integer> a = new ArrayList<Integer>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        int count = 0;
 
        for (int i = 0; i < 10; i++) {
            a.add(i);
        }
 
        for (int i = 0; i < 10; i++) {
            b.add(i + 15);
        }
 
        for (int i = 0; i < 20; i++) {
 
            if (i % 2 != 0) {
                a.add(i, b.get(count));
                count++;
            }
 
        }
        for (int i = 0; i < a.size(); i++) {
            System.out.println(a.get(i));
        }
 
    }
}
Разберись)
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
01.07.2016, 22:56
brainleo, вы в любом случае создаете промежуточную коллекцию только неявно.
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 23:35  [ТС]
Цитата Сообщение от DavidKarchikyan Посмотреть сообщение
Разберись
а ты разберись что произойдет с твоим кодом когда размер каждой из коллекций не 10, а 1 000 000

ты не против таких изменений в твоем коде???
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package by.topolev.serailize;
 
import java.util.ArrayList;
 
public class TestTest {
    public static void main(String args[]) {
         
        ArrayList<Integer> a = new ArrayList<Integer>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        int count = 0;
        int size = 1000000;
        for (int i = 0; i < size; i++) {
            a.add(i);
        }
 
        for (int i = 0; i < size; i++) {
            b.add(i + 15);
        }
 
        for (int i = 0; i < 2*size; i++) {
 
            if (i % 2 != 0) {
                a.add(i, b.get(count));
                count++;
            }
 
        }
        for (int i = 0; i < a.size(); i++) {
            System.out.println(a.get(i));
        }
 
    }
}
через профилировщик это "программа выполнялась 76489 миллисекунд"

Добавлено через 23 минуты
Если вдруг у кого идеи появятся, будет интересно, а так я тестировал следующие коды, при этом каждая коллекция содержит не менее 1 000 000 элементов и замер осуществлялся в среднем на 1000 вызовах.

Java
1
2
3
4
5
6
7
8
    
  static void merge0(ArrayList a, ArrayList b) {
        a.addAll(b);
        for (int i = b.size(); i > 0; i--) {
            a.set((i << 1) - 1, b.get(i - 1));
            a.set((i << 1) - 2, a.get(i - 1));
        }
    }
Итог в среднем 5 мс

Java
1
2
3
4
5
6
7
8
9
10
11
12
    static void merge1(ArrayList a, ArrayList b) {
 
        int size = b.size();
        a.ensureCapacity(size * 2);
        for (int i = 0; i < size; i++) {
            a.add(null);
        }
 
        for (int i = b.size(); i > 0; i--) {
            a.set((i << 1) - 1, b.get(i - 1));
            a.set((i << 1) - 2, a.get(i - 1));
        }
Итог в среднем 14 мс

Java
1
2
3
4
5
6
7
8
9
10
    static void merge2(ArrayList a, ArrayList b) {
        int size = b.size();
        for (int i = 0; i < size; i++) {
            a.add(null);
        }
        for (int i = b.size(); i > 0; i--) {
            a.set((i << 1) - 1, b.get(i - 1));
            a.set((i << 1) - 2, a.get(i - 1));
        }
    }
Итог в среднем 16 мс

Java
1
2
3
4
5
6
7
8
9
    static void merge3(ArrayList a, ArrayList b) {
        ArrayList c = new ArrayList(a.size()*2);
        
        for (int i=0; i<a.size();i++){
            c.add(a.get(i));
            c.add(b.get(i));
        }
        a.addAll(c);
    }
Итог в среднем 16 мс

Java
1
2
3
4
5
6
7
8
9
10
    static void merge4(ArrayList a, ArrayList b) {
        int size = a.size();
        int count = 0;
        for (int i = 0; i<size*2; i++){
            if (i % 2 != 0) {
                a.add(i, b.get(count));
                count++;
            }
        }
    }
Итога чуть дожадся и после даже первой итерации 76268 мс
0
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
01.07.2016, 23:39
Java
1
2
3
4
5
6
7
8
9
static void merge3(ArrayList a, ArrayList b) {
        ArrayList c = new ArrayList(a.size()*2);
        
        for (int i=0; i<a.size();i++){
            c.add(a.get(i));
            c.add(b.get(i));
        }
        a.addAll(c);
    }
Вот здесь вместо a.addAll(c), a = c попробуй.
0
1 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 13
01.07.2016, 23:43  [ТС]
DavidKarchikyan, в словах была ирония, а ведь
Цитата Сообщение от ninjacut Посмотреть сообщение
Вот здесь вместо a.addAll(c), a = c попробуй.
)) да, получилось 7 с, что ожидаемо )) но этот метод более ресурсоемкий за счет создания новой коллекции в любом случае. )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2016, 23:43
Помогаю со студенческими работами здесь

Задача на собеседовании
Текст задачи: Создать страницу с 2-мя блоками. В первом блоке ссылки, при нажатии на которые во втором блоке изменяется информация. ...

Задача на собеседовании
дана матрица NxM по ней можно двигаться либо вниз либо вправо найти минимальную сумму элементов находящихся на пути такого движения из...

Задача при собеседовании!
Не могу понять , как ее реализовать (не очень ясна поставлена задача ) помогите разобраться TODO List: Написать приложение списка...

Задача на логическое мышление на собеседовании
Имеется несколько классов. В каждом классе есть функция, внутри которой имеется длинный switch с одними и теми же логическими условиями для...

Задачка на собеседовании
Дали задачку на собеседовании.A,B-булевские переменные. Есть выражение A?B:!B нужно переписать вроде не используя условный оператор If.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru