JavaRush okuwçylary üçin programmirleme kynçylyklary, Java we tassyklaýjy iň gowy dostlar. Şeýle-de bolsa, her bir dörediji Padawan üçin kämahal ýoldan çykyp başlamaly, özi üçin kiçi taslamalary oýlap tapmaly we söhbetdeşliklere taýýarlanmaly wagty gelýär. Söhbetdeşlikde, kursdaky ýaly praktiki Java problemalaryna duş gelmeli ýaly. Köplenç bu dogry, ýöne käbir kompaniýalar hileli soraglar ýa-da üýtgeşik bir zat bermegi halaýarlar. Stressli söhbetdeşlik wagtynda bulaşmazlyk üçin, şeýle Java meselelerini özüňiz çözmäge synanyşyň.
Bu makalada bu kyn meseleleriň ýarysyna serederis. Ilki bilen şerti okamagyňyzy we özüňiz çözmäge synanyşmagyňyzy maslahat berýäris. Moreene bir zat: Java meselelerini her gün kursdan çözmegi ýatdan çykarmaň!
- 1-nji wezipe: Noldan başlap çäksiz aýlaw döretmek
- 2-nji wezipe. Executederine ýetiriljek teswir dörediň
- 3-nji wezipe: Atly aýlaw dörediň
- 4-nji wezipe. Bitewi sanlar toplumynda ýekeje dublikat hakda
- 5-nji wezipe. Bitewi sanlar toplumynda üýtgeşik däl dublikat hakda
Java meselesi - 1: Noldan başlap çäksiz aýlaw döretmek
Bir topar kod berildi Aýlawyň çäksiz bolmagy üçin ony tamamlaň.class ToInfinity {
public static void main(String[] args) {
//впишите code сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
"Hiç zat çylşyrymly däl" diýýärsiňiz. Bu ýagdaýa bir gezekden köp duş gelendigiňiz ähtimal: Java meselelerini çözýän wagtyňyzda çäksiz aýlaw döredip, ondan nädip dynmalydygy hakda pikir etdiňiz. Başga ýol. Hile, aýlawyň özi we ondan çykmagyň şertleri üýtgedilip bilinmez. Diňe iki gezek gaýtalama bar. Şeýle-de bolsa, çäksiz aýlaw döretmek üçin ýeterlikdir. Diňe iki gezek gaýtalamaly ýaly görünýär, ýöne aşmagy ulanyp çäksiz edip bolýar. Nädip diýip çakladyňyzmy?
Çözgüt
Suw joşmagy sebäpli.Integer.MAX_VALUE
Java-da saklap boljak iň ýokary bahadyr int
. Bu baha ýetip , artdyrsaňyz , iň pes baha çenli Integer.MAX_VALUE
aşak düşersiňiz . Şeýlelik bilen, bu Java meselesini çözmek üçin diňe maglumat görnüşi üçin iň ýokary bahadan 1 pes bolan üýtgeýjä baha bellemeli . Java-da iş kody: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); //убеждаемся в бесконечности цикла
}
}
}
Näme bolýar? Başlamak = 2147483645 (Integer.MAX_VALUE-1) bilen başlaýarys, indiki gaýtalama bahasy 2147483645, soň 2147483646, soň -2147483648, -2147483647 ... we ş.m.
Java meselesi-2. Executerine ýetiriljek teswir dörediň
Ine, biz geldik! Ilkinji leksiýalardan teswirleriň ýerine ýetirilmeýändigini eşitdik. Şol sebäpli teswirler. Bu meseläniň çözgüdi Java programmisti, hatda tejribeli adam üçinem elmydama düşnükli däl diýip pikir edýäris. Şeýle-de bolsa, Java enjamyny ýerine ýetirmek üçin teswir ýazmaga “kanuny” mejbur etmegiň bir kyn usuly bar. Windeliň nireden öwüsýändigini duýýarsyňyzmy? Çaklamaga synanyşyň!Çözgüt
Java-da meseläni çözmek üçin kod:public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
Bu ýumuşyň koduny Java-da IDE-de ýazsak, şuny alarys:
выполняемый комментарий
Munuň sebäbi, Java düzüjiniň “Unicod” nyşanyny \u000d
täze setir hökmünde okamagynyň we kodumyzy aşakdaky ýaly okamagynyň sebäbi: Kompilýator Java-da meseläni çözmek üçin kodlanan kod:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
Java Task - 3: Atly aýlaw dörediň
“Amaly programmirleme problemalary, sferik vakuumda Java” seriýasynyň başga bir wekili. Munuň näme üçin zerurdygy aýdyň däl manyda, aýlawyň şahsyýet däldigi sebäpli göwnüne degen bolmagy gaty ähtimal. Bolýar, bolýar, başga bir zat möhümdir: dil aýlawyň adyny bermäge mümkinçilik berýär.Çözgüt
Bellik: käbirlerine, şeýle "atlar" iş ýüzünde ulanmak maslahat berilmeýän "bellikler" diýilýär. Java-da meseläni çözmek üçin kod, atlandyrylan aýlawy görkezmekpublic 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);
}
}
}
}
Programmany işletseňiz, çykyş şeýle bolar:
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 ýerde atlandyrylan aýlawyň başyna gitmegi dowam etdirip bilersiňiz. Zerur bolsa, birnäçe aýlawy döwmek üçin break
(ýa-da ) -loop bilen continue
höwürtgede ulanyp bilersiňiz . Bu köp baýdak goýmazlyk we içki aýlawy dowam etdirmek ýa-da çykmak üçin kesgitlemek üçin synagdan geçmäge kömek eder. if-else
for
if-else
if-else
Java meselesi - 4. Bitewi sanlaryň ýeke-täk dublikaty hakda
1-den 100-e çenli elementleri öz içine alýan bitewi sanlaryň massiwini (ýa-daArrayList
isleýşiňiz ýaly) berilýär Integer
. Bu massiwde ýekeje we diňe bir köpeldilen element bar. Nädip tapmaly? Şeýle meseleler, Java programmistine öňki üçüsinden has tanyş. Sebäbi bu hiç haçan diýen ýaly ulanylmaýan diliň inçeliklerini bilmek däl-de, mantyk hakda. Zalym güýç bilen çözülýän ilkinji gözegçiliksiz itergi, kelläňiz açylanda ýa-da “Men programmist, men akylly” diýen pikir bar bolsa çalt ýitýär. Onlyeke-täk erbet tarapy, söhbetdeşlik wagtynda, stres astynda, bu bolup bilmez. Şonuň üçin çözgüdi gözlemezden ozal pikirleniň!
Çözüw algoritmi aşakdaky ýaly:
Numbershli sanlaryň jemini 1-den 100-e çenli hasaplaň. Muny nädip etmelidigiňizi bilýärsiňiz öýdýäris (mysal üçin, meşhur Gauss usulyny ulanyp). Indi massiwiňiziň elementleriniň jemini hasaplaň ýa-daArrayList’а
. We ... birinji mukdaryny ikinjisinden aýyryň. Bingo! Alnan san, dublikat elementiň bahasydyr. Java meselesini çözmek kody 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);
}
}
Başga bir çözgüt
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 meselesi - 5. Bitewi sanlar toplumynda üýtgeşik däl dublikat hakda
Öňki mesele size gaty aňsat görünýän bolsa, aşakdaky meseläni çözmäge synanyşyň: 1-den 100-e çenli bitewi san berilýär. Onda dublikatlar bar (birden köp). Birnäçe gezek ýüze çykýan elementleri nädip tapmaly (elementiň özüni tapyň we näçe gezek ýüze çykýandygyny görkeziň)?Çözgüt
Bu ýerde iň logiki çözgüt, gurluşy ulanmakdyrHashMap
, sebäbi maglumatlary esasy jübütlerde saklaýar. Java meselesini çözmek üçin 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