JavaRush /Java Blog /Random-TK /Java bir hile bilen problema: Salam, söhbetdeşlikler!

Java bir hile bilen problema: Salam, söhbetdeşlikler!

Toparda çap edildi
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ň.
Java bir hile bilen kynçylyk: Salam, söhbetdeşlikler!  - 1
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ň!

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_VALUEJava-da saklap boljak iň ýokary bahadyr int. Bu baha ýetip , artdyrsaňyz , iň pes baha çenli Integer.MAX_VALUEaş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_VALUEIntegerstartint
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 \u000dtä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örkezmek
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);
            }
        }
    }
}
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 continuehö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-elseforif-elseif-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-da ArrayListisleýş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-da ArrayList’а. 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 ulanmakdyr HashMap, 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);
    }
}

Netije

Java-daky amaly meseleler başgaça bolup biler we söhbetdeşiň size haýsy näbelli tapmany berjekdigini bilmeýärsiňiz. Şeýle-de bolsa, islendik ýeterlik iş beriji, kyn Java meselelerini çözmek ukybyndan has möhüminiň, işiňizde ýüze çykjak kynçylyklar ýaly hakyky amaly meseleleri çözmek ukybyňyz boljakdygyna düşünýär. Şonuň üçin olary mümkin boldugyça çözüň. Şonuň üçin JavaRush döredildi. Bu makalany taýýarlamakda geeksforgeeks-den materiallar ulanyldy.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION