JavaRush /Java блогу /Random-KY /Java көйгөйлөрү: Салам, интервьюлар!

Java көйгөйлөрү: Салам, интервьюлар!

Группада жарыяланган
JavaRush студенттери үчүн программалоо көйгөйлөрү, Java жана валидатор эң жакшы достор. Бирок, ар бир иштеп чыгуучу Падаванга кээде жолунан чыгып, өзү үчүн мини-долбоорлорду ойлоп таап, интервьюга даярданышы керек болгон учур келет. Интервьюда сиз курстагыдай эле практикалык Java көйгөйлөрүнө туш болушуңуз керек окшойт. Көпчүлүк учурларда бул туура, бирок кээ бир компаниялар куулук суроолорду же адаттан тыш нерсени берүүнү жакшы көрүшөт. Стресстүү маектешүү учурунда чаташып калбоо үчүн, Java программасынын мындай көйгөйлөрүн үйдөн өзү чечип көрүү пайдалуу.
Жападагы көйгөйлөр: Салам, интервьюлар!  - 1
Бул макалада биз бул татаал милдеттердин жарымын карап чыгабыз. Алгач шартты окуп чыгып, аны өзүңүз чечкенге аракет кылууну сунуштайбыз. Жана дагы бир нерсе: күн сайын курстан Java көйгөйлөрүн чечүүнү унутпаңыз!

Java көйгөйү - 1: нөлдөн баштап чексиз циклди түзүү

Код блогу берилген. Укук чексиз болушу үчүн аны бүтүрүңүз.
class ToInfinity {
    public static void main(String[] args) {

//впишите code сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
"Татаал эч нерсе жок" дейсиз. Кыязы, сиз бир эмес, бир нече жолу ушундай кырдаалга туш болгонсуз: Java маселелерин чечип жатып, сиз чексиз цикл түзүп, андан кантип кутулуу жөнүндө ойлондуңуз. Бул тескерисинче. Айла - циклдин өзүн жана андан чыгуу шарттарын өзгөртүүгө болбойт. Эки гана кайталоо бар. Бирок, алардын саны чексиз циклди түзүү үчүн жетиштүү. Бул эки гана кайталоо үчүн иштеши керек окшойт, бирок аны толуп кетүү аркылуу чексиз кылууга болот. Сиз буга чейин эле кандай деп ойлоду?

Чечим

Толуп кеткендиктен. Java'да сактала турган Integer.MAX_VALUEмаксималдуу маани . intЭгер сиз бул мааниге жетип , көбөйтсөңүз, анда төмөнкүгө , башкача айтканда, минималдуу мааниге чейин Integer.MAX_VALUEжыласыз . Ошентип, бул Java маселесин чечүү үчүн, биз жөн гана маалымат түрү үчүн максималдуу мааниден 1ге аз болгон өзгөрмөгө маани беришибиз керек . Java'дагы тапшырма codeу:Integer.MIN_VALUEIntegerstartint
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            //бесконечный цикл
            System.out.println(i); //убеждаемся в бесконечности цикла
        }
    }
}
Эмне болот? Биз start=2147483645 (Integer.MAX_VALUE-1) менен баштайбыз, кийинки итерацияда маани 2147483645 болот, андан кийин 2147483646, андан кийин -2147483648, -2147483647... ж.б.

Java тапшырмасы-2. Аткарылуучу комментарий түзүңүз

Мына, биз келдик! Алгачкы лекциялардан эле сын-пикирлер аткарылbyte деп уктук. Ошондуктан алар комментарийлер. Бул маселени чечүү Java программисти, атүгүл тажрыйбалуу адам үчүн дайыма эле айкын боло бербейт деп ойлойбуз. Бирок, Java машинасын аткаруу үчүн комментарийди "мыйзамдуу" иштетүүгө мажбурлоонун бир татаал жолу бар. Шамал кайдан согуп жатканын сезесизби? Болжолдоого аракет кылыңыз!

Чечим

Java көйгөйүн чечүү үчүн code:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Бул тапшырманын codeун IDEде Javaда терсек, анда биз төмөнкүнү алабыз:
выполняемый комментарий
Себеби, Java компилятору Unicod символун \u000dжаңы сап катары окуйт жана биздин codeду төмөнкүчө окуйт: Компилятор Javaдагы маселени чечүү үчүн codeду чечмеледи:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Java тапшырмасы - 3: аталган циклди түзүңүз

"Практикалык программалоо маселелери, сфералык вакуумдагы Java" сериясынын дагы бир өкүлү. Мунун эмне үчүн зарыл экендиги түшүнүксүз деген мааниде, цикл анын жеке эместигине таарынгандай сезorши күмөн. Ооба, макул, дагы бир нерсе маанилүү: тил циклге ат берүүгө мүмкүндүк берет.

Чечим

Эскертүү: кээ бирөөлөр үчүн мындай “аттар” “тегдер” катары белгилүү, аларды иш жүзүндө колдонуу сунушталbyte. Javaдагы маселени чечүү үчүн code, аталган циклди көрсөтүү
public class NamedLoop {
    public static void main(String[] args) {
        loop1:
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i == 3)
                    break loop1;
                System.out.println("i = " + i + " j = " + j);
            }
        }
    }
}
Эгер сиз программаны иштетсеңиз, натыйжа ушундай болот:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 0 j = 3
i = 0 j = 4
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 1 j = 3
i = 1 j = 4
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
i = 2 j = 3
i = 2 j = 4
Бул жерде сиз аталган циклдин башына өтүү үчүн улантууну да колдонсоңуз болот. breakЖана зарыл болсо, сиз (же ) менен continueуяланган циклде бир нече циклди колдонуу менен ажыратсаңыз болот . Бул көп желектерди коюудан жана ички циклди улантууну же чыгууну аныктоо үчүн аларды сыноодон качууга жардам берет. if-elseforif-elseif-else

Java маселеси - 4. Бүтүн сандардын массивиндеги жалгыз дубликат жөнүндө

1ден 100гө чейинки элементтерди камтыган бүтүн сандардын массиви (же ArrayListсиз каалагандай) берилген Integer. Бул массивде бир гана кайталанган элемент бар. Кантип тапса болот? Мындай тапшырмалар Java программистине мурунку үчөөнө караганда көбүрөөк тааныш. Анткени кеп тилдин дээрлик эч колдонулбаган кылдат жактарын билүү эмес, логика жөнүндө болуп жатат. Оор күч менен чечүү үчүн биринчи ооздукталбаган импульс сиздин башыңыз күйгөндө же "мен программистмин, мен акылдуумун" деген көз караш пайда болгондо тез эле жок болот. Бир гана жаман жери, интервью учурунда, стресске кабылганда, бул болбой калышы мүмкүн. Андыктан чечимди карап чыгуудан мурун ойлонуңуз!

Чечимдин алгоритми төмөнкүдөй:

1ден 100гө чейинки бардык сандардын суммасын эсептеңиз. Муну кантип жасоону билесиз деп ойлойбуз (мисалы, атактуу Гаусс ыкмасын колдонуу) Эми массивиңиздин элементтеринин суммасын же ArrayList’а. Ал эми... экинчи суммадан биринчи сумманы алып салуу. Бинго! Натыйжадагы сан кайталануучу элементтин мааниси. Java көйгөйүн чечүү codeу ArrayList.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FindDuplicate {
    private static void findDuplicate(List<Integer> elements) {
//находим сумму всех уникальных элементов списка
        int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
//находим сумму всех элементов списка
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 meaning 23
        elements.set(53, 23);
        findDuplicate(elements);
    }
}
Дагы бир чечим
import java.util.List;
import java.util.ArrayList;

public class Duplicate {

    public int findDuplicateNumber(List<Integer> numbers) {

        int highestNumber = numbers.size() - 1;
        int total = getSum(numbers);
        int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
        return duplicate;
    }

    public int getSum(List<Integer> numbers) {

        int sum = 0;
        for (int num : numbers) {
            sum = sum + num;
        }
        return sum;
    }

    public static void main(String a[]) {
        List <Integer> numbers = new ArrayList <Integer>();
        for (int i = 1; i < 100; i++) {
            numbers.add(i);
        }
        //добавляем дубликат в список
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
    }
}

Java маселеси - 5. Бүтүн сандардын массивиндеги уникалдуу эмес дубликат жөнүндө

Эгер мурунку маселе сизге оңой көрүнсө, анда төмөнкүнү чечип көрүңүз: 1ден 100гө чейинки бүтүн сандар барагы берилген. Ал дубликаттарды камтыйт (бирден ашык). Бир нече жолу кездешкен элементтерди кантип табууга болот (элементтин өзүн таап, анын канча жолу болоорун көрсөтүңүз)?

Чечим

Бул жерде эң логикалык чечим - бул сыяктуу структураны колдонуу HashMap, анткени ал маалыматтарды ачкыч-маани жуптарында сактайт. Java маселесин чечүү үчүн code:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SomeDuplicates {
    private static void findDuplicates(List<Integer> elements) {
        HashMap <Integer, Integer > duplicates = new HashMap < >();
//заполняем Map duplicates значениями по принципу:
// ключ – meaning element, meaning – сколько раз он встречается
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретorсь не более 1 раза,
//и сохраняем //результат в список (для удобства обработки на следующем шаге)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
//выводим результат для всех элементов в списке result
        result.forEach(e -> System.out.println(String.format("Элемент %d  встречается %d раз", e.getKey(), e.getValue())));
    }

    public static void main(String[] args) {
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
        elements.set(97, 23);
        elements.set(27, 51);
        elements.set(99, 23);
        findDuplicates(elements);
    }
}

Корутунду

Javaдагы практикалык көйгөйлөр абдан ар түрдүү болушу мүмкүн жана сиз интервью алуучу сизге кандай белгисиз табышмакты берерин билбейсиз. Бирок, ар бир адекваттуу иш берүүчү татаал Java көйгөйлөрүн чечүү жөндөмүнөн алда канча маанилүүрөөк сиздин ишиңизде кездешүүчү реалдуу практикалык көйгөйлөрдү чечүү жөндөмүңүз болорун түшүнөт . Андыктан аларды мүмкүн болушунча чечиңиз. Мына ошондуктан JavaRush түзүлдү. Бул макаланы даярдоодо geeksforgeeks материалдары колдонулган.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION