Тестовое задание.

Поиски работы, рассылания резюме, дали результат в виде того что мне прислали тестовое задание. Вот задание которые вызвало трудности.

Задан отсортированный в алфавитном порядке массив слов, состоящих из символов латинкого алфавита в нижнем регистре (a-z). Необходимо опредделить наибольшее по длинне составное слово в массиве. Под «составным» подразумевается слово, полностью сконструированное из других слов данного массива, при помощи конткатенации.
К примеру для массива [«five», «fivetwo», «fourfive», «fourfivetwo», «one», «onefiveone», «two», «twofivefourone»] ответом будет слово «fourfivetwo» с 11 буквами.

Был написан такой тест:

public static String[] sortedByAlphabetArray = {"five", "fivetwo", "fourfive", "fourfivetwo", "one", "onefiveone", "two", "twofivefourone"};
@Test
public void testGetMaxCompositeWord() throws Exception {
String exp = "fourfivetwo";
String act = new Exercise3().getMaxComplexWord(sortedByAlphabetArray);
assertEquals(exp, act);
}

И по размышлении такой вот код для теста:

public String getMaxComplexWord(String[] sortedByAlphabetArray) {
        List<String> list = new ArrayList<String>(Arrays.asList(sortedByAlphabetArray));
        StringBuilder maxComplexWord = new StringBuilder("");
        for (int i = 0; i < list.size(); i++) {
            if (isComplexWord(list.get(i)) && list.get(i).length() > maxComplexWord.length())
                maxComplexWord = new StringBuilder(list.get(i));
        }
        return maxComplexWord.toString();
    }

    /**
     * Check is given word are ComplexWord
     *
     * @param word
     * @return true or false
     */
    public boolean isComplexWord(String word) {
        boolean ret = false;
        List<String> list = new ArrayList<String>(Arrays.asList(sortedByAlphabetArray));
        Iterator itr = list.iterator();
        while (itr.hasNext()) {
            String substring = (String) itr.next();
            if (substring.length() >= word.length() || !word.contains(substring)) itr.remove();
        }
        Integer sumSubstringLength = 0;
        for (int i = 0; i < list.size(); i++) sumSubstringLength += list.get(i).length();
        if (word.length() <= sumSubstringLength) return true;
        return ret;
    }

Но у меня такое чувство что как-то некрасиво все. =(

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s