JavaRush /Java блогы /Random-KK /Трикпен Java проблемалары: Сәлем, сұхбаттар!

Трикпен Java проблемалары: Сәлем, сұхбаттар!

Топта жарияланған
JavaRush студенттері үшін бағдарламалау қиындықтары, Java және валидатор ең жақсы достар. Дегенмен, әрбір әзірлеуші ​​Падаван үшін кейде жолдан шығып, өзі үшін шағын жобалар ойлап тауып, сұхбатқа дайындалу керек болатын уақыт келеді. Сұхбатта сіз курстағыдай практикалық 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.Орындалатын түсініктеме жасаңыз

Міне, біз келдік! Алғашқы лекциялардан-ақ ескертулер орындалмайтынын естідік. Сондықтан олар пікірлер. Біздің ойымызша, бұл мәселенің шешімі Java-бағдарламашысы үшін, тіпті тәжірибелі адам үшін әрқашан анық бола бермейді. Дегенмен, Java машинасын орындау үшін түсініктемені «заңды түрде» іске қосуға мәжбүрлеудің бір қиын жолы бар. Сіз желдің қайдан соғып жатқанын сезесіз бе? Болжауға тырысыңыз!

Шешім

Java тіліндегі мәселені шешуге арналған code:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Осы тапсырманың codeын IDE ішінде Java тілінде терсек, мынаны аламыз:
выполняемый комментарий
Себебі, Java компиляторы Юниcode таңбасын \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» сериясының тағы бір өкілі. Бұл не үшін қажет екені түсініксіз деген мағынада, циклдің жеке тұлға емес екендігіне ренжігенін сезінуі екіталай. Жарайды, тағы бір нәрсе маңызды: тіл циклге атау беруге мүмкіндік береді.

Шешім

Ескерту: кейбіреулер үшін мұндай «аттар» «тегтер» ретінде белгілі, оларды іс жүзінде пайдалану ұсынылмайды. 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-elseбірнеше forциклдарды бөлуге болады if-else. Бұл көптеген жалауларды орнатудан және if-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