• ,

Онлайн тесты на работу.

Добрый день. Вообщем решил создать такую тему. Многие конторы при устройстве на работу используют онлайн тестирование. При том условия на англ. языке и вот сегодня я писал такой тест — www.hackerrank.com/
Рекомендую всем попробовать. Тем более что JavaRush свои задачи в паблик не приветствует, а там можно рейтинг потом работодателю показать. Но да ладно, не об этом сейчас.
Вообщем у меня было 4 теста, на 90 минут. Решать все не обязательно и написано что лучше решить несколько но качественно. И я бы хотел их обсудить, т.к. не понял как их можно было решить лучше)))))
Задача 1. Написать такое — static int result(int[] arr){}
Дается массив, в котором найти разницу между самым большим элементом и самым маленьким, при том индекс самого маленького должен быть меньше индекса самого большого.
Я решал наверно как все подумали — первый for ищет самый большой элемент и индекс.
Потом второй for ищет самый маленький элемент в элементах до indexMax.
И просто вывожу разницу. И вот это решение не самое оптимальное, набрало всего 3 теста из 10.
Какие есть предложения решить ее лучше? сейчас вот думаю может можно было как то в один фор вложить, но как, если последовательность после max элемента не должна участвовать… или возможно что нибудь типа public static synchronized и т.д. тоже дают плюсы по тестам, не проверял кроме public

Задача 2. написать String[] result(String S, String T){}
Дается две строки. (На javarush похожая была с файлами) Строка T это строка S без некоторых слов. Вернуть массив слов которых не хватает в Т.
Решал так split(t)=" " — результат в set;
split(s)=" ", for и если !set.contains(s[i]) то добавляем в ArrayListresult;
потом return result.toArray(new String[0]);
5 теста из 10;
Сначала result был Set — было 3 теста из 10;
У кого еще какие замечания и предложения есть?

Задача 3. я не решал но если кому интересно — дан текст String[] и найти все домены в тексте и вывести на экран. Типа «ляляля www.xyz.ru лялл ялл ww2.abc.com/sfsflj&dsf?dsfslj/index.html ляляля» вывести «xyz.ru;abc.com»

4-ая С бинарными деревьями, не читал, жаль времени было

6 комментариев

barmaleus
Задача 1. Мне кажется сначала можно было найти самый малый элемент в массиве, а вторым действием искать самый большой элемент. И в этом же действии создать переменную, которая будет показывать, во время какой по счету операции сравнения самый большой элемент был найден.
Heavy
Да, наверно так и есть, почти. Надо было искать сразу разницу между малым и большим. И если элемент больше чем предыдущий не встречается — то разница у нас уже есть, а если встречается, то просто ее пересчитать. 1 for 3 переменные min, max и result.
PS. Спасибо за комент и за подсказку
dmarsel
  • dmarsel
  • 0
  • Комментарий отредактирован 2016-04-13 16:56:01 пользователем dmarsel
Хотелось бы увидеть условие первой задачи в оригинале.
Насколько я понимаю, необходимо найти наибольшую разность элемента с большим индексом и элемента с меньшим индексом.
Если это так, то ваше решение не проходит для последовательности 9,10,1,5. Ваш ответ 1, а действительный 4.
Решение же barmaleus не пройдет для последовательности 6,10,1,2 по той же причине.
Если решать в лоб, то можно за 2 цикла для каждого элемента найти наименьший до него и сохранять наибольшую разностей. Такой алгоритм возможно и не оптимален, но должен работать для любой последовательности.
Heavy
Нет. условие было найти наибольший элемент, найти его индекс в массиве, затем найти наименьший элемент из тех у которых индекс будет меньше чем индекс наибольшего и найти разницу элементов.
MP92
  • MP92
  • 0
1-я задача за 1 цикл(правильно ли сделал?):


    static int result(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }

        Integer idxMin = null;
        Integer idxMax = null;

        Integer potentialIdxMax = null;

        for (int i = arr.length - 2; i >= 0; i--)
        {
            if (idxMin == null)
            {
                if (arr[i] <= arr[i + 1]) {
                    idxMin = i;
                    idxMax = potentialIdxMax = i + 1;
                }
            } else {
                if (arr[i + 1] > arr[potentialIdxMax]) {
                    potentialIdxMax = i + 1;
                }
                if (arr[i] < arr[idxMin]) {
                    idxMin = i;
                    idxMax = potentialIdxMax;
                }
            }
        }

        return idxMin == null ? 0 : arr[idxMax] - arr[idxMin];
    }
Heavy
ну как сказать… там было написано не обязательно решать все задачи, главное качество решения. Недавно начал читать книгу «Чистый код». Много что полезного вычитал.
По решению, я конечно не профессионал, но использовать Integer(целый объект) для хранения числа которое было int — думаю плохое решение, не добавить скорости приложению.
А из книги пока получил выводы — код должен быть понятен интуитивно. Лучше разбивать большой медот на private функции с интуитивно хорошо понятными называниями. Все что больше 5-10 строк — считается большим. Ну и после этих выводов я сам уже более понимаю как оценивать качество кода. Смысл в том, что этот код потом будут читать кучи программиство, которые будут сопровождать приложение в дальнейшем. А если через месяц ты сам в нем не сможешь за пару минут разобраться — значит цена твоего кода не большая.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.