Kanggo siswa JavaRush , tantangan pemrograman, Java, lan validator minangka kanca sing paling apik. Nanging, ana wektu kanggo saben pangembang Padawan nalika dheweke kudu miwiti metu saka trek, nggawe proyek mini kanggo awake dhewe lan nyiapake wawancara. Ing wawancara, mesthine sampeyan kudu nemoni masalah Jawa praktis sing padha karo kursus kasebut. Umume kasus iki bener, nanging sawetara perusahaan seneng takon pitakonan trick utawa sing ora biasa. Supaya ora bingung nalika wawancara sing stres, gunane nyoba ngrampungake masalah Jawa kasebut dhewe, ing omah.
Ing artikel iki kita bakal katon ing setengah rolas saka tugas angel iki. Disaranake sampeyan maca kahanan kasebut lan nyoba ngatasi dhewe. Lan siji maneh: aja lali ngrampungake masalah Jawa saka kursus saben dina!
- Tugas-1: Nggawe loop tanpa wates saka awal
- Tugas-2. Nggawe komentar sing bakal dieksekusi
- Tugas-3: Nggawe loop sing dijenengi
- Tugas-4. Babagan duplikat siji ing array integer
- Tugas-5. Babagan duplikat sing ora unik ing macem-macem integer
Masalah Jawa - 1: Nggawe daur ulang tanpa wates saka awal
Diwenehi blok kode. Rampungake supaya daur ulang dadi tanpa wates.class ToInfinity {
public static void main(String[] args) {
//впишите code сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
"Ora ana sing rumit," ujare. Paling kamungkinan, sampeyan wis ketemu dhewe ing kahanan iki luwih saka sapisan: nalika ngrampungake masalah Jawa, sampeyan nggawe loop tanpa wates lan mikir carane njaluk nyisihaken saka iku. Kosok baline. Trik kasebut yaiku siklus dhewe lan kondisi kanggo metu ora bisa diganti. Mung ana rong iterasi. Nanging, ana cukup kanggo nggawe loop tanpa wates. Kayane mung bisa digunakake kanggo rong iterasi, nanging bisa digawe tanpa wates kanthi nggunakake overflow. Apa sampeyan wis ngira carane?
Solusi
Amarga kebanjiran.Integer.MAX_VALUE
punika nilai maksimum sing int
bisa disimpen ing Jawa. Yen sampeyan tekan Integer.MAX_VALUE
lan nambah nilai iki, sampeyan muter mudhun menyang Integer.MIN_VALUE
, yaiku, menyang nilai minimal Integer
. Mangkono, kanggo ngatasi masalah Jawa iki, kita mung kudu nemtokake start
nilai kanggo variabel sing 1 kurang saka nilai maksimum kanggo jinis data int
. Kode tugas ing Jawa:
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); //убеждаемся в бесконечности цикла
}
}
}
Apa sing kedadeyan? Kita miwiti karo wiwitan = 2147483645 (Integer.MAX_VALUE-1), ing pengulangan sabanjure nilai dadi 2147483645, banjur 2147483646, banjur -2147483648, -2147483647 ... lan sateruse.
Tugas Jawa-2. Gawe komentar sing bakal dieksekusi
Inggih, kene kita! Saka ceramah sing sepisanan, kita krungu manawa komentar ora ditindakake. Mulane padha komentar. Kita mikir sing solusi kanggo masalah iki ora tansah ketok kanggo programmer Jawa, malah siji experienced. Nanging, ana cara sing angel kanggo meksa mesin Java supaya "sah" mbukak komentar kanggo eksekusi. Apa sampeyan rumangsa angin saka ngendi? Coba tebak!Solusi
Kode kanggo ngrampungake masalah ing Jawa:public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
Yen kita ngetik kode kanggo tugas iki ing Jawa ing IDE, iki kita entuk:
выполняемый комментарий
Alesane yaiku kompiler Jawa maca karakter Unicod \u000d
minangka baris anyar, lan maca kode kita kaya ing ngisor iki: Kompiler nyimpulake kode kanggo ngrampungake masalah ing Jawa:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
Tugas Jawa - 3: Nggawe loop sing dijenengi
Wakil liyane saka seri "masalah pemrograman praktis, Jawa ing vakum bola." Ing pangertèn sing ora cetha apa iki perlu, iku ora kamungkinan sing siklus ngrasa gelo dening kasunyatan sing impersonal. Inggih, oke, ana liyane sing penting: basa ngidini sampeyan menehi jeneng siklus.Solusi
Cathetan: kanggo sawetara, "jeneng" kasebut dikenal minangka "tag", sing ora dianjurake kanggo digunakake ing praktik. Kode kanggo ngrampungake masalah ing Jawa, nuduhake loop sing dijenengipublic 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);
}
}
}
}
Iki minangka output yen sampeyan mbukak program:
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
Ing kene sampeyan uga bisa nggunakake terus menyang wiwitan daur ulang sing dijenengi. Lan yen perlu, sampeyan bisa nggunakake break
(utawa continue
) ing nested if-else
karo for
-loop kanggo break munggah sawetara puteran nggunakake if-else
. Iki bakal mbantu supaya ora nyetel akeh panji lan nyoba if-else
kanggo nemtokake manawa bakal nerusake utawa metu saka daur ulang.
Masalah Jawa - 4. Babagan mung duplikat ing Uploaded wilangan bulat
Diwenehi larik (utawaArrayList
, sing disenengi) saka ongko ngemot unsur Integer
saka 1 kanggo 100. Uploaded iki wis siji lan mung siji unsur duplikat. Carane nemokake iku? Tugas kasebut luwih akrab karo programmer Java tinimbang telung sadurunge. Amarga iku dudu babagan ngerti subtleties basa, sing meh ora tau digunakake, nanging babagan logika. Impuls unbridled pisanan kanggo ngatasi dening brute force ilang cukup cepet nalika sirah nguripake utawa ana sikap "Aku programmer, aku pinter." Siji-sijine sing ala yaiku sajrone wawancara, sajrone stres, iki bisa uga ora kedadeyan. Dadi mikir saiki sadurunge ndeleng solusi!
Algoritma solusi kaya ing ngisor iki:
Ngetung jumlah kabeh nomer saka 1 kanggo 100. Kita mikir sampeyan ngerti carane nindakake iki (contone, nggunakake metode Gauss misuwur) Saiki ngetung jumlah saka unsur Uploaded utawaArrayList’а
. Lan ... nyuda jumlah pisanan saka nomer loro. Bingo! Nomer sing diasilake yaiku nilai unsur duplikat. kode solusi masalah Jawa kanggo 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);
}
}
Solusi liyane
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));
}
}
Masalah Jawa - 5. Babagan duplikat non-unik ing array integer
Yen masalah sadurunge katon gampang banget kanggo sampeyan, banjur coba ngatasi masalah ing ngisor iki: diwenehi lembar wilangan bulat saka 1 nganti 100. Isine duplikat (luwih saka siji). Kepiye carane nemokake unsur sing kedadeyan luwih saka sepisan (goleki unsur kasebut dhewe lan nuduhake kaping pirang-pirang kedadeyan kasebut)?Solusi
Solusi sing paling logis ing kene yaiku nggunakake struktur kayataHashMap
, amarga nyimpen data ing pasangan kunci-nilai. Kode kanggo ngrampungake masalah Jawa:
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