JavaRush /وبلاگ جاوا /Random-FA /مشکلات جاوا با یک ترفند: سلام، مصاحبه ها!

مشکلات جاوا با یک ترفند: سلام، مصاحبه ها!

در گروه منتشر شد
برای دانشجویان JavaRush ، چالش های برنامه نویسی، جاوا و اعتباردهنده بهترین دوستان هستند. با این حال، زمانی برای هر توسعه دهنده Padawan فرا می رسد که باید گاهی اوقات از مسیر شکست خورده خارج شود، پروژه های کوچکی برای خود ارائه کند و برای مصاحبه آماده شود. در مصاحبه، به نظر می رسد که دقیقاً باید با همان مشکلات عملی جاوا مانند دوره مواجه شوید. در بیشتر موارد این درست است، اما برخی از شرکت ها دوست دارند سؤالات ترفندی یا چیزهای غیرعادی بپرسند. برای جلوگیری از سردرگمی در طول یک مصاحبه استرس زا، مفید است که سعی کنید چنین مشکلات جاوا را خودتان در خانه حل کنید.
مشکلات جاوا با یک ترفند: سلام، مصاحبه ها!  - 1
در این مقاله نیم دوجین از این کارهای دشوار را بررسی خواهیم کرد. توصیه می کنیم ابتدا شرایط را بخوانید و خودتان سعی کنید آن را حل کنید. و یک چیز دیگر: فراموش نکنید که هر روز مسائل جاوا را از دوره حل کنید!

مشکل جاوا - 1: ایجاد یک حلقه بی نهایت از ابتدا

یک بلوک کد داده شده است. آن را کامل کنید تا حلقه بی نهایت شود.
class ToInfinity {
    public static void main(String[] args) {

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

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
شما می گویید: «هیچ چیز پیچیده ای نیست. به احتمال زیاد، بیش از یک بار در این موقعیت قرار گرفته اید: در حین حل مشکلات جاوا، یک حلقه بی نهایت ایجاد کرده اید و به این فکر کرده اید که چگونه از شر آن خلاص شوید. این برعکس است. ترفند این است که خود چرخه و شرایط خروج از آن قابل تغییر نیست. فقط دو تکرار وجود دارد. با این حال، به اندازه کافی از آنها برای ایجاد یک حلقه بی نهایت وجود دارد. به نظر می رسد فقط باید برای دو تکرار کار کند، اما با استفاده از سرریز می توان آن را بی نهایت ساخت. آیا قبلا حدس زده اید که چگونه؟

راه حل

به دلیل سرریز. Integer.MAX_VALUEحداکثر مقداری است که intمی توان در جاوا ذخیره کرد. اگر به این مقدار رسیدید Integer.MAX_VALUEو آن را افزایش دادید، به پایین می روید Integer.MIN_VALUE، یعنی به حداقل مقدار Integer. startبنابراین، برای حل این مشکل جاوا، فقط باید مقداری را به متغیر اختصاص دهیم که 1 کمتر از حداکثر مقدار برای نوع داده باشد int. کد وظیفه در جاوا:
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 task-2. یک نظر ایجاد کنید که اجرا شود

خوب، ما اینجا هستیم! از همان سخنرانی های اول شنیدیم که کامنت ها اجرا نمی شوند. برای همین کامنت هستند. ما فکر می کنیم که راه حل این مشکل برای یک برنامه نویس جاوا، حتی یک برنامه نویس با تجربه، همیشه واضح نیست. با این حال، یک راه دشوار برای مجبور کردن ماشین جاوا به اجرای "قانونی" یک نظر برای اجرا وجود دارد. آیا احساس می کنید باد از کجا می وزد؟ سعی کنید حدس بزنید!

راه حل

کد حل مشکل در جاوا:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
اگر کد این کار را در جاوا در IDE تایپ کنیم، این چیزی است که دریافت می کنیم:
выполняемый комментарий
دلیل آن این است که کامپایلر جاوا کاراکتر یونیکد را \u000dبه عنوان یک خط جدید می خواند و کد ما را به صورت زیر می خواند: کامپایلر کد را برای حل مشکل در جاوا رمزگشایی کرده است:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

وظیفه جاوا - 3: یک حلقه با نام ایجاد کنید

نماینده دیگری از سری "مشکلات برنامه نویسی عملی، جاوا در خلاء کروی". به این معنا که مشخص نیست چرا این امر ضروری است، بعید است که چرخه از این واقعیت که غیرشخصی است، آزرده خاطر شود. خوب، خوب، چیز دیگری مهم است: زبان به شما اجازه می دهد تا نامی به چرخه بدهید.

راه حل

توجه: برای برخی، چنین "نام هایی" به عنوان "برچسب" شناخته می شوند که استفاده از آنها در عمل توصیه نمی شود. کد برای حل مسئله در جاوا، نشان دادن یک حلقه با نام
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برای ادامه یا خروج از حلقه داخلی کمک می کند.

مشکل جاوا - 4. در مورد تنها تکراری در یک آرایه از اعداد صحیح

با توجه به یک آرایه (یا ArrayList، همانطور که شما ترجیح می دهید) از اعداد صحیح حاوی عناصر Integerاز 1 تا 100. این آرایه دارای یک و تنها یک عنصر تکراری است. چگونه آن را پیدا کنیم؟ چنین وظایفی برای یک برنامه نویس جاوا بیشتر از سه مورد قبلی آشنا هستند. چرا که نه در مورد دانستن ظرافت های زبان که تقریباً هرگز استفاده نمی شود، بلکه در مورد منطق است. اولین انگیزه لجام گسیخته برای حل با زور خیلی سریع ناپدید می شود وقتی سر شما روشن می شود یا این نگرش وجود دارد که "من یک برنامه نویس هستم، من باهوش هستم". تنها چیز بد این است که در طول مصاحبه، تحت استرس، ممکن است این اتفاق نیفتد. بنابراین قبل از اینکه به دنبال راه حل باشید، اکنون فکر کنید!

الگوریتم حل به شرح زیر است:

مجموع همه اعداد از 1 تا 100 را محاسبه کنید فکر می کنیم شما می دانید چگونه این کار را انجام دهید (مثلاً با استفاده از روش معروف گاوس) حالا مجموع عناصر آرایه خود را محاسبه کنید یا ArrayList’а. و ... مقدار اول را از دومی کم کنید. بینگو! عدد حاصل مقدار عنصر تکراری است. کد حل مشکل جاوا برای 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));
    }
}

مشکل جاوا - 5. در مورد یک تکراری غیر منحصر به فرد در آرایه ای از اعداد صحیح

اگر مشکل قبلی برای شما خیلی آسان به نظر می‌رسید، پس مشکل زیر را حل کنید: یک برگه از اعداد صحیح از 1 تا 100 داده می‌شود. حاوی موارد تکراری (بیش از یک) است. چگونه می توان عناصری را که بیش از یک بار رخ می دهند پیدا کرد (خود عنصر را پیدا کنید و نشان دهید چند بار اتفاق می افتد)؟

راه حل

منطقی ترین راه حل در اینجا استفاده از ساختاری مانند HashMap, زیرا داده ها را در جفت های کلید-مقدار ذخیره می کند. کد برای حل مشکل جاوا:
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);
    }
}

نتیجه

مشکلات عملی در جاوا می تواند بسیار متفاوت باشد، و شما نمی دانید که مصاحبه کننده تصمیم می گیرد چه نوع پازل ناشناخته ای به شما بدهد. با این حال، هر کارفرمای کافی می‌داند که بسیار مهم‌تر از توانایی حل مشکلات پیچیده جاوا، توانایی شما در حل مشکلات عملی واقعی است ، مانند مواردی که در طول کار با آن‌ها مواجه خواهید شد. پس تا حد امکان آنها را حل کنید. به همین دلیل JavaRush ایجاد شد. در تهیه این مقاله از مطالب geeksforgeeks استفاده شده است.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION