JavaRush شاگردن لاءِ ، پروگرامنگ چئلينجز، جاوا، ۽ تصديق ڪندڙ بهترين دوست آهن. تنهن هوندي، هر ڊولپر پاڊوان لاء هڪ وقت اچي ٿو جڏهن توهان کي ڪڏهن ڪڏهن مارڻ واري ٽريڪ کان پري وڃڻ شروع ڪرڻ جي ضرورت آهي، پنهنجي لاء مني پروجيڪٽ سان گڏ، ۽ انٽرويو لاء تيار ڪريو. انٽرويو ۾، اهو لڳي ٿو ته توهان کي ساڳيو ئي عملي جاوا مسئلن کي منهن ڏيڻ گهرجي جيئن ڪورس ۾. اڪثر ڪيسن ۾ اهو سچ آهي، پر ڪجهه ڪمپنيون چال سوال پڇڻ پسند ڪن ٿيون يا ڪجهه غير معمولي. دٻاءُ واري انٽرويو دوران پريشان ٿيڻ کان بچڻ لاءِ، اهو مفيد آهي ته جاوا جا مسئلا پاڻ حل ڪرڻ جي ڪوشش ڪريو، گهر ۾.
هن مقالي ۾ اسين انهن منجهيل ڪمن مان اڌ درجن تي نظر وجهنداسين. اسان سفارش ڪريون ٿا ته توهان پهريان شرط پڙهو ۽ ان کي حل ڪرڻ جي ڪوشش ڪريو. ۽ هڪ ٻي شيءِ: هر روز جاوا جا مسئلا حل ڪرڻ نه وساريو!
- ٽاسڪ-1: شروع کان لامحدود لوپ ٺاهڻ
- ڪم-2. ھڪڙو تبصرو ٺاھيو جيڪو عمل ڪيو ويندو
- ٽاسڪ-3: نالي وارو لوپ ٺاهيو
- ڪم-4. انٽيجرز جي صف ۾ ھڪڙي ھڪڙي نقل بابت
- ڪم-5. انٽيجرز جي هڪ صف ۾ هڪ غير منفرد نقل بابت
جاوا مسئلو - 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... وغيره ٿيندي.
جاوا ٽاسڪ-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
) هڪ nested if-else
with for
-loop استعمال ڪندي ڪيترن ئي لوپ کي ٽوڙڻ لاءِ if-else
. هي مدد ڪندو ڪيترن ئي جھنڊن کي ترتيب ڏيڻ کان بچڻ ۽ انھن کي if-else
جانچڻ لاءِ معلوم ڪرڻ لاءِ ته ڇا جاري رکڻ يا اندرين لوپ مان نڪرڻ.
جاوا مسئلو - 4. انٽيجرز جي هڪ صف ۾ صرف نقل بابت
1 کان 100 تائينArrayList
عنصرن تي مشتمل عددن جي هڪ صف ڏني وئي آهي (يا ، جيئن توهان چاهيو ٿا). Integer
ان کي ڪيئن ڳولڻ لاء؟ اهڙا ڪم جاوا پروگرامر کي پوئين ٽن کان وڌيڪ واقف آهن. ڇاڪاڻ ته اهو ٻوليءَ جي نزاڪت کي ڄاڻڻ بابت نه آهي، جيڪي تقريباً ڪڏهن به استعمال نه ڪيا ويا آهن، پر منطق بابت. برٽ فورس ذريعي حل ڪرڻ لاءِ پهريون بي لگام تسلسل تمام جلدي غائب ٿي ويندو آهي جڏهن توهان جو مٿو ڦرندو آهي يا اتي هڪ رويو هوندو آهي ”مان هڪ پروگرامر آهيان، مان هوشيار آهيان“. صرف خراب شيء اها آهي ته هڪ انٽرويو دوران، دٻاء هيٺ، اهو ٿي سگهي ٿو. تنهن ڪري هاڻي سوچيو ان کان اڳ جو توهان حل کي ڏسو!
حل الورورٿم هن ريت آهي:
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);
}
}
GO TO FULL VERSION