JavaRush /مدونة جافا /Random-AR /مشاكل جافا مع خدعة: مرحبًا، المقابلات!

مشاكل جافا مع خدعة: مرحبًا، المقابلات!

نشرت في المجموعة
بالنسبة لطلاب JavaRush ، تعد تحديات البرمجة وJava والمدقق من أفضل الأصدقاء. ومع ذلك، يأتي وقت يحتاج فيه كل مطور Padawan إلى البدء في الخروج عن المسار المطروق في بعض الأحيان، والتوصل إلى مشاريع صغيرة لنفسه والاستعداد للمقابلات. في المقابلة، يبدو أنك يجب أن تواجه نفس مشاكل Java العملية تمامًا كما في الدورة. يكون هذا صحيحًا في معظم الحالات، لكن بعض الشركات تحب طرح أسئلة خادعة أو شيء غير عادي. لتجنب الخلط أثناء المقابلة المجهدة، من المفيد محاولة حل مشكلات Java هذه بنفسك في المنزل.
مشاكل جافا مع خدعة: مرحبًا، المقابلات!  - 1
في هذه المقالة سوف نلقي نظرة على ستة من هذه المهام الصعبة. ننصحك بقراءة الحالة أولاً ومحاولة حلها بنفسك. وشيء آخر: لا تنس حل مشاكل Java من الدورة كل يوم!

مشكلة جافا - 1: إنشاء حلقة لا نهائية من البداية

نظرا لكتلة من التعليمات البرمجية. أكملها بحيث تصبح الحلقة لا نهائية.
class ToInfinity {
    public static void main(String[] args) {

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

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
"لا شيء معقد"، كما تقول. على الأرجح، لقد وجدت نفسك في هذا الموقف أكثر من مرة: أثناء حل مشكلات Java، قمت بإنشاء حلقة لا نهاية لها وفكرت في كيفية التخلص منها. على العكس. الحيلة هي أن الدورة نفسها وشروط الخروج منها لا يمكن تغييرها. لا يوجد سوى اثنين من التكرارات. ومع ذلك، هناك ما يكفي منهم لإنشاء حلقة لا نهاية لها. يبدو أنه يجب أن يعمل فقط لتكرارين، ولكن يمكن جعله لا نهائيًا باستخدام الفائض. هل خمنت بالفعل كيف؟

حل

بسبب الفائض. Integer.MAX_VALUEهي القيمة القصوى التي intيمكن تخزينها في جافا. إذا وصلت إلى Integer.MAX_VALUEهذه القيمة وقمت بزيادتها، فإنك تنتقل Integer.MIN_VALUEإلى الحد الأدنى للقيمة Integer. وبالتالي، لحل مشكلة Java هذه، نحتاج فقط إلى تعيين 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... وهكذا.

مهمة جافا 2. قم بإنشاء تعليق سيتم تنفيذه

حسنا، نحن هنا! سمعنا منذ المحاضرات الأولى أن التعليقات لا يتم تنفيذها. لهذا السبب هم تعليقات. نعتقد أن حل هذه المشكلة ليس واضحًا دائمًا لمبرمج Java، حتى لو كان متمرسًا. ومع ذلك، هناك طريقة واحدة صعبة لإجبار جهاز Java على تشغيل تعليق للتنفيذ "بشكل قانوني". هل تشعر من أين تهب الريح؟ حاول ان تتوقع!

حل

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

مهمة جافا - 3: إنشاء حلقة مسماة

ممثل آخر لسلسلة “مشكلات البرمجة العملية، جافا في فراغ كروي”. بمعنى أنه ليس من الواضح سبب ضرورة ذلك، فمن غير المرجح أن تشعر الدورة بالإهانة من حقيقة أنها غير شخصية. حسنًا، هناك شيء آخر مهم: اللغة تسمح لك بتسمية الدورة.

حل

ملاحظة: بالنسبة للبعض، تُعرف هذه "الأسماء" باسم "العلامات"، والتي لا يوصى باستخدامها عمليًا. رمز لحل المشكلة في Java، يوضح حلقة مسماة
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. تحتوي هذه المصفوفة على عنصر واحد مكرر واحد فقط. كيفية العثور عليه؟ مثل هذه المهام مألوفة أكثر لمبرمج Java من المهام الثلاثة السابقة. لأن الأمر لا يتعلق بمعرفة التفاصيل الدقيقة للغة، والتي لا تُستخدم أبدًا تقريبًا، بل يتعلق بالمنطق. أول دافع جامح للحل بالقوة الغاشمة يختفي بسرعة كبيرة عندما يدور رأسك أو يكون هناك موقف "أنا مبرمج، أنا ذكي". الشيء السيئ الوحيد هو أنه خلال المقابلة، تحت الضغط، قد لا يحدث هذا. لذا فكر الآن قبل أن تنظر إلى الحل!

خوارزمية الحل هي كما يلي:

احسب مجموع كل الأرقام من 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);
    }
}

خاتمة

يمكن أن تكون المشكلات العملية في Java مختلفة تمامًا، ولا تعرف نوع اللغز غير المعروف الذي سيقرر القائم بإجراء المقابلة تقديمه لك. ومع ذلك، فإن أي صاحب عمل مناسب يدرك أن الأهم من القدرة على حل مشكلات Java الصعبة هو قدرتك على حل المشكلات العملية الحقيقية ، مثل تلك التي ستواجهها أثناء عملك. لذا قم بحلها قدر الإمكان. ولهذا السبب تم إنشاء JavaRush. تم استخدام مواد من geeksforgeeks في إعداد هذه المقالة.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION