5 вопросов на засыпку

Задачи, которые должен уметь решать каждый.
17 июня 2016326451Илья Бубнов49441022

Любое квалифицированное собеседование со специалистом при приёме на работу строится примерно по одному и тому сценарию: сначала вас пытаются успокоить, задавая общие вопросы, часто к работе не имеющие никакого отношения. Потом начинается блиц из общих знаний по тематике будущей профессии, от простого к сложному, от слов к графикам и кодам. И вот когда в самом конце напряжение начнёт зашкаливать, вашу голову начнут раздирать сомнения относительно правильности ответов, собеседующий вас специалист предложит решить относительно простую даже для начинающего программиста задачу.

И вы обязательно решите, потому что наиболее типовые мы рассмотрим прямо сейчас.

Найти факториал

Задача с вычислением факториала числа рассматривается буквально с самого первого знакомства с циклами. Соответственно, как минимум 3 решения лежат именно в этой области. В Java, например, это for, dowhile, while. Но что, если надо найти минимум 4? Если нет привязки к языкам, то в старом добром Pascal можно вспомнить метки goto. Но ключевое же решение обычно на таких собеседованиях забывается. Рекурсия.

class Factorial {
    int fact(int n) {
        int result;

        if (n == 1)
            return 1;

        result = fact(n - 1) * n;
        return result;
    }
}

Factorial f = new Factorial();
int YourNumber = 100;

textViewInfo.setText(YourNumber + "! = “ + f.fact(YourNumber));

Обмен значениями

Даже если вы делаете первые шаги в программировании, вы уже догадываетесь, как значение переменной a присвоить переменной b, и наоборот. Правильно, через третью переменную с. А вот вам типичный вопрос из собеседования на позицию junior: проделайте эту же операцию, но без использования третьей переменной. Знаете ответ?

a = a + b;
b = a - b;
a = a - b;

Элементарный XOR.

Последовательность Фибоначчи

Задача из разряда «напугать новичка названием». Если вы ещё помните, что такое последовательность Фибоначчи, то половину задачи вы уже решили. Если нет, то наверняка вам интересно будет поискать алгоритм в следующих числах 1,1,2,3,5,8,13… И вывести все чила этой последовательности до 100.

Последовательность складывается крайне просто: каждое следующее число является суммой двух предыдущих. А записать это можно в тело простого цикла:

public static void main(String[] args) {
        int n = 101;
        int num1 = 1, num2 = 1;
        System.out.print(num1 + ", " + num2);
        int num12 = 2, i = 2;

        while (i < n) {
            num12 = num1 + num2;
            num1 = num2;
            num2 = num12;
            System.out.print(" " + num12);
            i++;
        }
    }

Проверка анаграммы

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

Задача сводится скорее к внимательности, никакого оригинального решения можете не искать. Сначала проверяем длину двух слов и сбиваем все буквы в нижний регистр:

Public class AnagramCheck {
 public static boolean isAnagram(String word, String anagram){

       if(word.length() != anagram.length()){
              return false; 
       }

       char[] chars = word.toCharArray();

       for(char c : chars){
              int index = anagram.indexOf(c);

              if(index != -1){
                        anagram = anagram.substring(0,index) + anagram.substring(index +1, anagram.length());
              }else{
              return false;
              } 
 }

 return anagram.isEmpty();
}

После чего сортируем оба массива и выдаём результат

public static boolean iAnagram(String word, String anagram){
    char[] charFromWord = word.toCharArray();
    char[] charFromAnagram = anagram.toCharArray();

    Arrays.sort(charFromWord);
    Arrays.sort(charFromAnagram);

    return Arrays.equals(charFromWord, charFromAnagram);
}


public static boolean checkAnagram(String first, String second){
    char[] characters = first.toCharArray();
    StringBuilder sbSecond = new StringBuilder(second);

    for(char ch : characters){
        int index = sbSecond.indexOf("" + ch);

        if(index != -1){
            sbSecond.deleteCharAt(index);
        }else{
        return false;
        }
    }

return sbSecond.length()==0 ? true : false;
}

Ничего сложного, согласитесь?

Числа Армстронга

Ещё одна задачка на последовательности и страх неизвестных названий, с той лишь разницей, что о числах Фибоначчи слышало куда больше людей. Итак, перед вами следующие числа: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371. Что их объединяет и какое число будет следующим?

Это так называемые числа Армстронга, а секрет последовательности заключается в том, что каждое число является суммой составляющих цифр и степени значности. Т.е.

153 = 1^3 + 5^3 + 3^3

Придумали решение для поиска следующего числа? Вот моё предложение:

Проверяем каждое трёхзначное число (допускаем, что оно трёхзначное) с 372.

public class ArmstrongTest{ public static void main(String args[]) {
     System.out.println("Please enter a 3 digit number to find if its an Armstrong number:");
     int number = 371;

     while(isArmStrong(number+1)){
          i++;
     }

     System.out.println("Number : " + number + " is an Armstrong number");
}

А вот и сама проверка.

private static boolean isArmStrong(int NextArm) {
     int result = 0;
     int orig = NextArm;

     while(NextArm != 0){
          int digit = NextArm%10;
          result = result + digit*digit*digit;
          NextArm = NextArm/10; 
     }

     if(orig == result){
          return false;
     }

     return false;
}

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


For the JAVA: профессия «Java-разработчик».