Пару вопросов с собеседования [требует правки]

240
17 апреля 2017, 03:33

Недавно был за собеседовании на стажера (java). Там было очень интересное собеседование в процессе которого выяснилось что некоторых знаний мне недодали а некоторые я просто не заучил. Буду благодарен за ресурсы где можно почитать об этом.

Вопрос первый , что бы яснее его понимать надо пересказать кусок диалога: "-Что такое наследование? -Наследование это механизм позволяющий переиспользовать методы описанные в одном классе в другом классе(да , не самое "научное" объяснение ну да едем дальше) -Хорошо , допустим есть класс в котором все методы паблик. ЗАЧЕМ нам от него наследоваться?"

В тот момент мой и без того нагруженный стрессом мозг не родил ничего умного но со временем я понял что можно было ответить про то что нам не придется создавать объект этого класса. И вообщем то все. Ничего умнее больше придумать я не смог. Вопрос первый закончен.

Следующий вопрос: "-Есть массив не отсортированных чисел. Найти комбинацию двух цифр дающих конкретную сумму. Как вы решите задачу? -Напишу вложенный цикл и переберу значения -Вложенный во что? -Цикл в цикле -Хорошо , но тогда у вас будут повторятся переборы. Т.е. в какой то момент у вас возникнет итерация цикла где выбрано второе и третье значения а в какой то где третье и второе. -Хм...Что бы этого не происходило я сделаю внутренний итератор равный внешнему +1 -И какая будет скорость этого алгоритма? -Ээээ..."

Заглянув в свои лекции я понял что ничего не знаю о том как измерять эти самые алгоритмы перебора значений(не путать с сортировкой и поиском просто конкретного значения) Т.е. задачу в принципе решил бы так:

int [] mas = new int{3,2,5,4,1,7,6};
int summa = myMethod(mas,5);
public int myMethod(int []mas,int sum){
int confirm = 0;
for(int i =0;i<mas.length;i++) {
   for(int j = i+1;j<mas.length;j++){
      confirm = mas[i]+mas[j];
      if(confirm == sum){
         return confirm;
      }
   }
 }
return 0;
}

Но вот как замерить сумму алгоритма - хз. Где об этом можно почитать и есть ли более "изящные" решения?

И последний вопрос на который я не могу понять те ответы которые нахожу в гугле: Где надо использовать абстрактный класс а где интерфейс? С джавы 8 в интерфейсах можно писать реализованные методы и вот как бы момент в том что разница между абстрактным классом и интерфейсом стирается. Может кто сможет человеческим языком объяснить что лучше использовать?

Answer 1

-Хорошо , допустим есть класс в котором все методы паблик. ЗАЧЕМ нам от него наследоваться?"

Чтобы иметь возможность изменить/расширить состояние/поведение класса, в то же время не потеряв возможность использовать его в контекстах, в которых требуется объект базового класса.

-И какая будет скорость этого алгоритма?

O(N2)

Где надо использовать абстрактный класс а где интерфейс?

Интерфейс не может иметь состояние. Если вам не нужно определять поля - используйте интерфейс, в противном случае придётся использовать абстрактный класс.

Answer 2

Вопросов много и все очень обширные (не для Stackoverflow).

Хорошее понимание ООП и возможностей Java для новичков дадут пара книг издательства O'Reilly коллекции HeadFirst: "Изучаем Java" и "Паттерны проектирования".

По сложности алгоритмов - вот хорошая статья для новичков: https://habrahabr.ru/post/104219/

READ ALSO
Создание label из JS

Создание label из JS

Добрый день!

281
вызов js в окне iframe

вызов js в окне iframe

Есть вот такие плееры, очень стали популярныТам перед просмотром нужно смотреть 15 секунд рекламу

270
Действия над многоугольником

Действия над многоугольником

Мне надо нарисовать с помощью кликов на форме многоугольник Я многоугольник нарисовалИ надо сделать над ним следующие действия:

200