JavaRush/Java блог/Архив info.javarush/Онлайн тесты на работу.
Heavy
30 уровень

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

Статья из группы Архив info.javarush
участников
Добрый день. Вообщем решил создать такую тему. Многие конторы при устройстве на работу используют онлайн тестирование. При том условия на англ. языке и вот сегодня я писал такой тест - https://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]) то добавляем в ArrayList result; потом return result.toArray(new String[0]); 5 теста из 10; Сначала result был Set - было 3 теста из 10; У кого еще какие замечания и предложения есть? Задача 3. я не решал но если кому интересно - дан текст String[] и найти все домены в тексте и вывести на экран. Типа "ляляля http://www.xyz.ru лялл ялл http://ww2.abc.com/sfsflj&dsf?dsfslj/index.html ляляля" вывести "xyz.ru;abc.com" 4-ая С бинарными деревьями, не читал, жаль времени было
Комментарии (6)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
MP92
Уровень 39
16 апреля 2016, 16:35
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
Уровень 30
19 апреля 2016, 11:47
ну как сказать… там было написано не обязательно решать все задачи, главное качество решения. Недавно начал читать книгу «Чистый код». Много что полезного вычитал.
По решению, я конечно не профессионал, но использовать Integer(целый объект) для хранения числа которое было int — думаю плохое решение, не добавить скорости приложению.
А из книги пока получил выводы — код должен быть понятен интуитивно. Лучше разбивать большой медот на private функции с интуитивно хорошо понятными называниями. Все что больше 5-10 строк — считается большим. Ну и после этих выводов я сам уже более понимаю как оценивать качество кода. Смысл в том, что этот код потом будут читать кучи программиство, которые будут сопровождать приложение в дальнейшем. А если через месяц ты сам в нем не сможешь за пару минут разобраться — значит цена твоего кода не большая.
dmarsel
Уровень 9
13 апреля 2016, 16:56
Хотелось бы увидеть условие первой задачи в оригинале.
Насколько я понимаю, необходимо найти наибольшую разность элемента с большим индексом и элемента с меньшим индексом.
Если это так, то ваше решение не проходит для последовательности 9,10,1,5. Ваш ответ 1, а действительный 4.
Решение же barmaleus не пройдет для последовательности 6,10,1,2 по той же причине.
Если решать в лоб, то можно за 2 цикла для каждого элемента найти наименьший до него и сохранять наибольшую разностей. Такой алгоритм возможно и не оптимален, но должен работать для любой последовательности.
Heavy
Уровень 30
19 апреля 2016, 11:36
Нет. условие было найти наибольший элемент, найти его индекс в массиве, затем найти наименьший элемент из тех у которых индекс будет меньше чем индекс наибольшего и найти разницу элементов.
barmaleus
Уровень 30
8 апреля 2016, 13:38
Задача 1. Мне кажется сначала можно было найти самый малый элемент в массиве, а вторым действием искать самый большой элемент. И в этом же действии создать переменную, которая будет показывать, во время какой по счету операции сравнения самый большой элемент был найден.
Heavy
Уровень 30
8 апреля 2016, 13:47
Да, наверно так и есть, почти. Надо было искать сразу разницу между малым и большим. И если элемент больше чем предыдущий не встречается — то разница у нас уже есть, а если встречается, то просто ее пересчитать. 1 for 3 переменные min, max и result.
PS. Спасибо за комент и за подсказку