JavaRush /Java блог /Архив info.javarush /Тестовое задания для Trainee
JuriMik
26 уровень
Харьков

Тестовое задания для Trainee

Статья из группы Архив info.javarush
Вобщем-то простенькое тестовое задание на позицию Trainee Functional Developer, так сказать, для затравки. Я проходил собеседование 2 года назад, поэтому не думаю, что сделаю что-то страшное выложив задание. Link для ленивых неангличан. Заявки на конкурс принимаются до 08.02 до 01:00 по Киеву (Москва до 02:00). Если поддержите плюсиками - запилю бложик отдельно для тестовых задачек, их у меня есть предостаточно. Думаю, будет интересно. Свой вариант пока не выкладываю, дабы не сбивать ваш полет фантазии."> Himeg Torin Javin tonyloner
Комментарии (63)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
fatfaggy Уровень 26
1 ноября 2017
условие таково, что никаких вводных данных не требуется. поэтому, считаю, что мой вариант будет быстрее всего :)

public int findPalindrome() {
    return 906609;
}
Javin Уровень 7
11 февраля 2017
Похоже, что не угасший интерес, а некие обстоятельства непреодолимой силы не позволили автору темы подвести итоги конкурса. Жаль!
Алгоритм уважаемого Himegа даёт, похоже, наибольшее быстродействие. Но лично для меня, к сожалению, он так и остался вне понимания.
Осталось загадкой и то, что никто пока не использовал возможности многопоточности. Хотя некоторые участники, предполагаю, разбираются и в ней. Почему же они не стали применять эту технологию? Ведь практически у всех в персональных компьютерах стоят многоядерные микропроцессоры и от параллельных вычислений, полагаю, можно получить прирост в быстродействии.
Javin Уровень 7
4 февраля 2017
НА КОНКУРС. Номинация «Экстрим».

/**
 * ПОИСК НАИБОЛЬШЕГО ПАЛИНДРОМА ДЛЯ ПРОИЗВЕДЕНИЯ ТРЕХЗНАЧНЫХ ДЕСЯТИЧНЫХ ЧИСЕЛ
 * @author Javin
 */

public class maxPalindrome {

      public static void main(String[] args) {

        int palindrome = 0, a = 9, b = 9, c = 9, m = -1;

        long startTime = System.nanoTime();

        marker:
        for (; a > -1; a--) {

            for (; b > -1 ; b--) {

                for (; c > -1; c--) {

                    palindrome =  100001 * a + 10010 * b + 1100 * c; // abccba

                    for (int j = 999; j >= 500 ; j--) {              // см. Примечание

                        if (palindrome % j == 0 &&  palindrome / j <= 999) {
                            m = j;
                            break marker;
                        }

                    }

                }

                c = 9;
            }

            b = 9;

        }

        long timeSpent = System.nanoTime();

        System.out.println("Наибольший палиндром для произведения трёхзначных десятичных чисел: "+ m +
                " * " + palindrome / m + " = " + palindrome);
        System.out.printf("\nВремя поиска палиндрома составило: %d наносекунд\n", timeSpent - startTime );

    }
}

Intel Core i7-2600 CPU @ 3.4 GHz x 4, RAM 16 GB, Linux

Наибольший палиндром для произведения 3-значных десятичных чисел: 993 * 913 = 906609

Время поиска палиндрома составило: 563039 наносекунд

Примечание
Пусть для палиндрома 178871 найдено одно из трехзначных чисел 707, то второе вычисляется как 178871 / 707 = 253. И после отыскания числа в диапазоне от 999 до 500 уже не имеет смысл поиск другого числа, т. е. 253, в диапазоне от 100 до 499, так оно элементарно вычисляется.
tonyloner Уровень 37
3 февраля 2017
public class Palindrome {
    public static void main(String[] args) {
        long startTime = new Date().getTime();
        int result = 0;
        int num1 = 0;
        int num2 = 0;
        for(int i = 999; i >= 100; i--) {
            for(int j = i; j >= 100; j--) {
                int value = i*j;
                if(value < result) {
                    break;
                }
                if(isPalindrome(value)) {
                    result = value;
                    num1 = i;
                    num2 = j;
                    break;
                }
            }
        }
        System.out.println("Result: " + result + " = " + num1 + "x" + num2);
        System.out.println("Time: " + (new Date().getTime() - startTime) + "ms");
    }

    public static boolean isPalindrome(int value) {
        int a = value % 10;
        int b = (value % 100) / 10;
        int c = (value % 1000) / 100;
        if (value/1000 == a*100 + b*10 + c)
            return true;
        return false;
    }
}


Result: 906609 = 993x913
Time: 1ms
Intel® Core(TM) i3 CPU @ 2.93GHz, RAM 8 GB, Linux
Javin Уровень 7
2 февраля 2017
НА КОНКУРС

/**
 * ПОИСК НАИБОЛЬШЕГО ПАЛИНДРОМА ДЛЯ ПРОИЗВЕДЕНИЯ ТРЕХЗНАЧНЫХ ДЕСЯТИЧНЫХ ЧИСЕЛ
 * @author Javin
 */

public class maxPalindrome {

    public static final int NUMBER_OF_DECIMAL_SIGN = 3; //начиная с 5 десятичных знаков, переменная
                                                        //palindrome станет больше Integer.MAX_VALUE
                                                        //и произойдет аварийное завершение программы

    public static void main(String[] args) {

        int palindrome, maxNumberOfDecimalSign, minNumberOfDecimalSign, centralNumber;
        StringBuilder builder = new StringBuilder();
        StringBuilder builderRevers = new StringBuilder();

/*Добавлено для универсальности кода при иных значениях NUMBER_OF_DECIMAL_SIGN*/

        for (int i = 1; i <= NUMBER_OF_DECIMAL_SIGN; i++) {                                 // "999"
            builder.append(9);
        }

        maxNumberOfDecimalSign = Integer.parseInt(builder.toString());                      // 999
        centralNumber = maxNumberOfDecimalSign/2 + 1;                                  // 500 см.Примеч.

        builder.delete(0, NUMBER_OF_DECIMAL_SIGN);

        builder.append(1); // "1"

        for (int i = 1; i <= NUMBER_OF_DECIMAL_SIGN - 1; i++) {                             // "100"
            builder.append(0);
        }

        minNumberOfDecimalSign = Integer.parseInt(builder.toString());                     // 100
        builder.delete(0, NUMBER_OF_DECIMAL_SIGN);

/*Основная часть*/
        long startTime = System.nanoTime();

        marker:
        for (int i = maxNumberOfDecimalSign; i >= minNumberOfDecimalSign ; i--) {          // 999; 100

            builder.append(i);                                                             // "987"
            builder.append(builderRevers.append(i).reverse());                             // "987789&
rembrand87 Уровень 32
2 февраля 2017
НЛО прилетело и опубликовало эту надпись здесь
Torin Уровень 27
2 февраля 2017
Вот появилась мысль, но не пойму насколько она легитимна :) мысль из серии хитрожопости:

В моем решении слишком много вычислений проводится в методе findPalindrome(). Мне кажется сам процесс перебора и умножения мало относится к задаче «найти наибольший палиндром». Можно ли вычисления сделать предварительными? я могу загнать данные в TreeMap с ключем равным произведению, которое будет записано в стринге (которую потом просто распарсю). Таким образом палиндром будет проверяться по ключам TreeMap. Я не знаю насколько быстро происходит изъятие из TreeMap, но я бы избавился от вложенного цикла и от операции умножения. Я думаю это окупится процентов на 150%
imp Уровень 31
1 февраля 2017
интересно, что напишет ТС про то как он делал тест и что от него ждали )

с одной стороны был явный намек на интерес к умению рефакторинга, с другой стороны вполне могли ждать реализации алгоритма Манакера, но его надо знать =\
Torin Уровень 27
1 февраля 2017
Если я правильно понял задание, нужно найти максимальный палиндром, образованный перемножением двух трехзначных чисел, по аналогии с:

9009 = 91 х 99.

Я выкатываю первую версию своего кода, однако оставляю за собой право на правки до 08.02.
Но если вдруг окажется, что все норм, то #на_конкурс.

import shine.sol.*;
import java.util.*;

class Main{
    static final int MAX_VALUE = 999;
    static int num1 = MAX_VALUE;
    static int num2 = MAX_VALUE;
    static boolean switcher = false;
    static String maxPalindrome;
    
    public static void main(String[] args){
        long st = System.currentTimeMillis();
        findPalindrome();
        long delta = System.currentTimeMillis() - st;
        System.out.println("Числовой палиндром: " + maxPalindrome + " = " + num1 + " x " + num2);
        System.out.println("Времени затрачено: " + delta + " мс");
    }
    
    public static void findPalindrome() {       
        for (num1 = Main.MAX_VALUE; num1 > 100; num1--) {
            for (num2 = Main.MAX_VALUE; num2 > 100; num2--) {
                int tmp = num1 * num2;                
                if (tmp < 100000) {
                    break;
                }
                if (isPalindrome(tmp)) {                    
                    return;
                }
            }            
        }
    }
    
    public static boolean isPalindrome(int i) {
        String initial = Integer.toString(i);        
        String p1 = initial.substring(0, initial.length() / 2);
        StringBuilder p2 = new StringBuilder();        
        for (int ii = initial.length() - 1; ii > initial.length() / 2 - 1; ii--) {
            p2.append(initial.charAt(ii));
        }        
        if (p1.equals(p2.toString())) {            
            maxPalindrome = initial;  
Roman_kh Уровень 33
1 февраля 2017
Классная идея с блогом для тестовых задач. У меня тоже есть одна. У тебя не хвататет рейтинга для блога. Я могу создать блог, будешь там модератором