أفضل أصدقاء طلاب CodeGym
هم مهام البرمجة وJava ومدقق المهام. ومع ذلك، يأتي وقت يجب فيه على كل مطور في بادوان أن يبدأ في السير خارج المسار المطروق، وابتكار مشاريعه الصغيرة الخاصة، وإعداد نفسه لإجراء المقابلات. قد يعتقد المرء أن المقابلة ستحتوي على نفس مهام Java العملية الموجودة في هذه الدورة التدريبية. وهذا هو الحال في معظم الحالات، لكن بعض الشركات تحب طرح أسئلة خادعة أو شيء غير مألوف. لتجنب الانزعاج أثناء مقابلة مرهقة، من المفيد محاولة حل مهام Java المماثلة بنفسك في المنزل.
في هذه المقالة، سوف نستكشف 5 من هذه المهام الصعبة. ننصحك بقراءة الشروط أولاً ومحاولة حلها بنفسك. وشيء آخر: لا تنس القيام بمهام Java في هذه الدورة كل يوم!
- المهمة 1: إنشاء حلقة لا نهائية من الصفر
- المهمة 2: إنشاء تعليق قابل للتنفيذ
- المهمة 3: إنشاء حلقة مسماة
- المهمة 4: ابحث عن نسخة مكررة واحدة في مصفوفة من الأعداد الصحيحة
- المهمة 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 */
}
}
}
" هذا ليس بالأمر الصعب "، كما تقول. من المرجح أنك وجدت نفسك في هذا السيناريو بشكل متكرر: أثناء إكمال مهمة Java، قمت بإنشاء حلقة لا نهائية وكان عليك التفكير في كيفية التخلص منها. حسنا، هذا هو العكس. إليك الجزء الصعب: لا يمكنك تغيير الحلقة نفسها أو شروط الخروج الخاصة بها. لا يوجد سوى اثنين من التكرارات. لكنها كافية لإنشاء حلقة لا نهائية. يبدو أنه يجب تنفيذه لتكرارين فقط، ولكن يمكنك جعله لا نهائيًا باستخدام السعة الفائضة. هل خمنت بالفعل كيف؟
حل
بسبب تجاوز السعة،Integer.MAX_VALUE
هذه هي القيمة القصوى التي int
يمكن تخزينها في Java. إذا وصلت إلى Integer.MAX_VALUE
هذه القيمة وقمت بزيادتها، فإنك ترجع إلى Integer.MIN_VALUE
، أو بالأحرى، إلى أدنى Integer
قيمة ممكنة. وبالتالي، لإكمال مهمة Java هذه، نحتاج ببساطة إلى تعيين 1 أقل من الحد الأقصى int
لقيمة start
المتغير. كود جافا لهذه المهمة:
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: إنشاء تعليق قابل للتنفيذ
حسنا، نحن هنا! منذ الدروس الأولى، سمعنا أن التعليقات لا يتم تنفيذها. ولهذا السبب يطلق عليهم التعليقات. نعتقد أن حل هذه المهمة لن يكون دائمًا واضحًا لمبرمجي Java، حتى ذوي الخبرة. ومع ذلك، هناك طريقة واحدة صعبة (لكنها "قانونية") لجعل JVM ينفذ تعليقًا. هل يمكنك الشعور بالمكان الذي نتجه إليه؟ حاول ان تتوقع!حل
كود جافا لهذه المهمة:public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d System.out.println("executable comment");
}
}
إذا أدخلنا كود Java هذا في IDE، فإليك ما سنحصل عليه:
executable comment
وذلك لأن مترجم Java يفسر حرف Unicode \u000d
كسطر جديد، ويقرأ الكود الخاص بنا مثل هذا: كود Java لهذه المهمة، كما يتم تفسيره بواسطة المترجم:
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. تحتوي المصفوفة على عنصر واحد مكرر واحد فقط. كيف وجدته؟ من الشائع أن يحصل مبرمج Java على هذا النوع من المهام مقارنة بالمهام الثلاثة السابقة. لأنه يتعلق بالمنطق وليس بمعرفتك بالتفاصيل الدقيقة للغة التي نادرًا ما تستخدم. إن دافعك الجامح الأول لاستخدام القوة الغاشمة سوف يمر بسرعة عندما يبدأ عقلك في العمل أو تدرك "أنا مبرمج. أنا ذكي". المشكلة الوحيدة هي أنه أثناء المقابلة، عندما تكون تحت الضغط، قد لا يحدث هذا. لذا فكر الآن قبل أن تنظر إلى الحل!
ها هي الخوارزمية
احسب مجموع كل الأرقام من 1 إلى 100. نعتقد أنك تعرف كيف يمكنك القيام بذلك (على سبيل المثال، باستخدام طريقة غاوس الشهيرة). الآن احسب مجموع العناصر في المصفوفة أوArrayList
. و... اطرح المجموع الأول من الثاني. البنغو! الرقم الناتج هو قيمة العنصر المكرر. كود Java لهذه المهمة باستخدام ملف 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، لأنه يخزن البيانات في أزواج ذات قيمة مفتاحية. رمز هذه المهمة في Java: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);
}
}
GO TO FULL VERSION