CodeGym /وبلاگ جاوا /Random-FA /وظایف جاوا با پیچ و تاب: سلام، مصاحبه!
John Squirrels
مرحله
San Francisco

وظایف جاوا با پیچ و تاب: سلام، مصاحبه!

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

وظیفه 1: یک حلقه بی نهایت از ابتدا ایجاد کنید

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

// Insert code here

        for (int i = start; i <= start + 1; i++) {
             /* This should be an infinite loop, but don't change anything here */
        }
    }
}
شما می گویید : « این سخت نیست . شما به احتمال زیاد بارها و بارها خود را در این سناریو پیدا کرده اید: در حین تکمیل یک کار جاوا، یک حلقه بی نهایت ایجاد کرده اید و باید به این فکر می کردید که چگونه از شر آن خلاص شوید. خوب، این برعکس است. بخش مشکل اینجاست: شما نمی توانید خود حلقه یا شرایط خروج آن را تغییر دهید. فقط دو تکرار وجود دارد. اما، آنها برای ایجاد یک حلقه بی نهایت کافی هستند. به نظر می رسد فقط باید برای دو تکرار اجرا شود، اما می توانید با استفاده از سرریز آن را بی نهایت کنید. آیا قبلا حدس زده اید که چگونه؟

راه حل

به دلیل سرریز، Integer.MAX_VALUEحداکثر مقداری است که یک intcan در جاوا ذخیره می کند. اگر به این مقدار رسیدید و آن را افزایش دادید ، به پایین‌ترین مقدار ممکن Integer.MAX_VALUEبرمی‌گردید یا بهتر است بگوییم. بنابراین، برای تکمیل این وظیفه جاوا، فقط باید 1 کمتر از حداکثر مقدار را به متغیر اختصاص دهیم. کد جاوا برای این کار: Integer.MIN_VALUEIntegerintstart
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            // Infinite loop
            System.out.println(i); // Be sure we are in an infinite loop
        }
    }
}
چه اتفاقی می افتد؟ ما با start=2147483645 (Integer.MAX_VALUE-1) شروع می کنیم. در تکرار بعدی مقدار می شود 2147483645، سپس 2147483646، سپس -2147483648، -2147483647 ... و به همین ترتیب.

وظیفه 2: یک نظر اجرایی ایجاد کنید

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

راه حل

کد جاوا برای این کار:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
اگر این کد جاوا را در یک IDE وارد کنیم، این چیزی است که به دست می آوریم:
executable comment
این به این دلیل است که کامپایلر جاوا کاراکتر یونیکد را \u000dبه عنوان یک خط جدید تفسیر می کند و کد ما را اینگونه می خواند: کد جاوا برای این کار، همانطور که توسط کامپایلر تفسیر می شود:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \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
همچنین می توانید از کلمه کلیدی continue برای بازگشت به ابتدای یک حلقه نامگذاری شده استفاده کنید. و در صورت لزوم، می توانید از 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();
// Find the sum of all list elements
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("The repeated element is: " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
// Create a list of sequential elements in the interval [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
// Add the value 23 at index 53
        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);
        }
        // Add a duplicate to the list
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("The repeated element is: " + 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 <>();
// Use the following rule to populate the Map duplicates:
// the key is the element value, and the value is the number of times it occurs
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
// Remove any elements that don't occur more than once from the Map duplicates
// and store the result as a list (to make it easy to work with in the next step)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
// Write the results for all elements to the result list
        result.forEach(e -> System.out.println(String.format("Element %d  occurs %d times", 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);
    }
}

نتیجه

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