JavaRush talabalari uchun dasturlash muammolari, Java va validator eng yaxshi do'stdir. Biroq, har bir ishlab chiquvchi Padavan uchun shunday vaqt keladiki, u ba'zida yo'ldan ketishni boshlashi, o'zi uchun mini-loyihalarni ishlab chiqishi va intervyularga tayyorlanishi kerak. Suhbatda siz kursdagi kabi amaliy Java muammolariga duch kelishingiz kerakdek tuyuladi. Aksariyat hollarda bu to'g'ri, lekin ba'zi kompaniyalar hiyla-nayrang yoki g'ayrioddiy narsalarni so'rashni yaxshi ko'radilar. Stressli intervyu paytida chalkashmaslik uchun Java bilan bog'liq bunday muammolarni o'zingiz, uyda hal qilishga harakat qilish foydalidir.
Ushbu maqolada biz ushbu qiyin vazifalarning yarim o'ntasini ko'rib chiqamiz. Avval shartni o'qib chiqishingizni va uni o'zingiz hal qilishga harakat qilishingizni tavsiya qilamiz. Va yana bir narsa: har kuni kursdan Java muammolarini hal qilishni unutmang!
- Vazifa-1: noldan cheksiz halqa yaratish
- Vazifa-2. Amalga oshiriladigan sharh yarating
- Vazifa-3: Nomlangan sikl hosil qiling
- Vazifa-4. Butun sonlar massividagi bitta dublikat haqida
- Vazifa-5. Butun sonlar massividagi noyob bo'lmagan dublikat haqida
Java muammosi - 1: noldan cheksiz tsikl yaratish
Kod bloki berilgan. Loop cheksiz bo'lishi uchun uni to'ldiring.class ToInfinity {
public static void main(String[] args) {
//впишите code сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
"Hech narsa murakkab emas", deysiz. Ehtimol, siz bir necha marta bunday vaziyatga duch kelgansiz: Java muammolarini hal qilishda siz cheksiz tsikl yaratdingiz va undan qanday qutulish haqida o'yladingiz. Bu aksincha. Ayyorlik shundaki, tsiklning o'zi va undan chiqish shartlarini o'zgartirib bo'lmaydi. Faqat ikkita takrorlash mavjud. Biroq, cheksiz pastadir yaratish uchun ularning soni etarli. Ko'rinishidan, u faqat ikkita iteratsiya uchun ishlashi kerak, ammo uni to'ldirish orqali cheksiz qilish mumkin. Qanday qilib siz allaqachon taxmin qildingizmi?
Yechim
To'lib ketishi tufayli. Java-da saqlanishi mumkin bo'lganInteger.MAX_VALUE
maksimal qiymatdir . int
Agar siz ushbu qiymatga erishsangiz va oshirsangiz, ga, ya'ni minimal qiymatga Integer.MAX_VALUE
o'tasiz . Shunday qilib, ushbu Java muammosini hal qilish uchun biz o'zgaruvchiga ma'lumotlar turi uchun maksimal qiymatdan 1 ga kichik qiymat belgilashimiz kerak . Java-dagi vazifa kodi:Integer.MIN_VALUE
Integer
start
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); //убеждаемся в бесконечности цикла
}
}
}
Nima bo'ladi? Biz start=2147483645 (Integer.MAX_VALUE-1) bilan boshlaymiz, keyingi iteratsiyada qiymat 2147483645, keyin 2147483646, keyin -2147483648, -2147483647... va hokazo bo'ladi.
Java topshirig'i-2.Bajariladigan izoh yarating
Xo'sh, biz shu yerdamiz! Birinchi ma'ruzalardanoq biz sharhlar bajarilmasligini eshitdik. Shuning uchun ular sharhlardir. Bizning fikrimizcha, bu muammoni hal qilish har doim ham Java dasturchisi, hatto tajribali uchun ham aniq emas. Biroq, Java mashinasini sharhni bajarish uchun "qonuniy" ishga tushirishga majburlashning bitta qiyin usuli bor. Shamol qayerdan esayotganini his qilyapsizmi? Taxmin qilishga harakat qiling!Yechim
Java-da muammoni hal qilish uchun kod:public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
Agar biz ushbu vazifa uchun kodni Java-da IDE-da yozsak, biz quyidagilarni olamiz:
выполняемый комментарий
Sababi, Java kompilyatori Unicod belgisini \u000d
yangi satr sifatida o'qiydi va bizning kodni quyidagicha o'qiydi: Kompilyator Java'dagi muammoni hal qilish uchun kodni dekodladi:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
Java vazifasi - 3: Nomlangan tsikl yarating
"Amaliy dasturlash muammolari, sferik vakuumdagi Java" turkumining yana bir vakili. Buning nima uchun zarurligi aniq emasligi sababli, tsiklning shaxsiyatsizligi tufayli xafa bo'lishi dargumon. Xo'sh, yaxshi, yana bir narsa muhim: til sizga tsiklga nom berishga imkon beradi.Yechim
Eslatma: ba'zilar uchun bunday "ismlar" "teglar" sifatida tanilgan, ulardan amalda foydalanish tavsiya etilmaydi. Java-da muammoni hal qilish uchun kod, nomli tsiklni namoyish qilishpublic 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);
}
}
}
}
Agar siz dasturni ishga tushirsangiz, natija shunday bo'ladi:
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
Bu yerda siz nomli sikl boshiga o'tish uchun davom etish tugmasidan ham foydalanishingiz mumkin. break
Va agar kerak bo'lsa, siz (yoki continue
) dan foydalanib, bir nechta tsikllarni ajratish uchun -loop if-else
ichida foydalanishingiz mumkin . Bu juda ko'p bayroqlarni o'rnatishdan va ichki tsiklni davom ettirish yoki chiqishni aniqlash uchun ularni sinab ko'rishdan qochishga yordam beradi. for
if-else
if-else
Java muammosi - 4. Butun sonlar massividagi yagona dublikat haqida
1 dan 100 gacha boʻlgan elementlarni oʻz ichiga olgan butun sonlar massivi (yokiArrayList
xohlaganingizcha) berilgan. Bu massiv bitta va faqat bitta takrorlanuvchi elementga ega. Integer
Uni qanday topish mumkin? Bunday vazifalar Java dasturchisiga oldingi uchtasiga qaraganda ko'proq tanish. Chunki gap tilning deyarli ishlatilmaydigan nozik tomonlarini bilish emas, balki mantiq haqida ketmoqda. Qo'pol kuch bilan hal qilish uchun birinchi jilovsiz impuls sizning boshingiz aylanganda yoki "men dasturchiman, men aqlliman" degan munosabat paydo bo'lganda juda tez yo'qoladi. Yagona yomon narsa shundaki, suhbat paytida, stress ostida, bu sodir bo'lmasligi mumkin. Shunday ekan, yechimni izlashdan oldin o‘ylab ko‘ring!
Yechim algoritmi quyidagicha:
1 dan 100 gacha bo'lgan barcha raqamlar yig'indisini hisoblang. Biz buni qanday qilishni bilasiz deb o'ylaymiz (masalan, mashhur Gauss usulidan foydalangan holda) Endi massivingizning elementlari yig'indisini hisoblang yokiArrayList’а
. Va... birinchi miqdorni ikkinchisidan ayirib tashlang. Bingo! Olingan raqam ikki nusxadagi elementning qiymati. Java uchun muammoni hal qilish kodi 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);
}
}
Boshqa yechim
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));
}
}
Java muammosi - 5. Butun sonlar massividagi noyob bo'lmagan dublikat haqida
Agar oldingi muammo sizga juda oson tuyulgan bo'lsa, quyidagini hal qilib ko'ring: 1 dan 100 gacha bo'lgan butun sonlar varag'i berilgan. U dublikatlarni (birdan ortiq) o'z ichiga oladi. Bir necha marta sodir bo'lgan elementlarni qanday topish mumkin (elementning o'zini toping va uning necha marta sodir bo'lishini ko'rsating)?Yechim
Bu erda eng mantiqiy yechim - kabi strukturadan foydalanishHashMap
, chunki u ma'lumotlarni kalit-qiymat juftliklarida saqlaydi. Java muammosini hal qilish uchun kod:
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