CodeGym/Blog Java/Aleatoriu/Sarcini Java cu o întorsătură: salut, interviuri!
John Squirrels
Nivel
San Francisco

Sarcini Java cu o întorsătură: salut, interviuri!

Publicat în grup
Cei mai buni prieteni ai studenților CodeGym sunt sarcinile de programare, Java și validatorul de sarcini. Cu toate acestea, vine un moment în care fiecare dezvoltator de padawan trebuie să înceapă să iasă din drumurile bătute, să-și inventeze propriile mini-proiecte și să se pregătească pentru interviuri. S-ar putea crede că interviul ar avea exact aceleași sarcini practice Java care se găsesc în acest curs. Și așa este în majoritatea cazurilor, dar unor companii le place să pună întrebări truc sau ceva necunoscut. Pentru a evita să fii tulburat în timpul unui interviu stresant, este util să încerci să rezolvi singur sarcini Java similare acasă.
Sarcini Java cu o întorsătură: salut, interviuri!  - 1
În acest articol, vom explora 5 astfel de sarcini dificile. Vă recomandăm să citiți mai întâi condițiile și să încercați să le rezolvați singur. Și încă ceva: nu uitați să faceți sarcini Java în acest curs în fiecare zi!

Sarcina 1: Creați o buclă infinită de la zero

A fost furnizat un bloc de cod. Adăugați la el pentru a face bucla infinită.
class ToInfinity {
    public static void main(String[] args) {

// Insert code here

        for (int i = start; i <= start + 1; i++) {
             /* This should be an infinite loop, but don't change anything here */
        }
    }
}
Nu e greu ”, spui tu. Mai mult ca sigur v-ați găsit în acest scenariu în mod repetat: în timp ce finalizați o sarcină Java, ați creat o buclă infinită și a trebuit să vă gândiți cum să scăpați de ea. Ei bine, asta e invers. Iată partea dificilă: nu puteți schimba bucla în sine sau condițiile de ieșire. Există doar două iterații. Dar, ele sunt suficiente pentru a crea o buclă infinită. Se pare că ar trebui să se execute doar pentru două iterații, dar îl puteți face infinit folosind overflow. Ai ghicit deja cum?

Soluţie

Din cauza depășirii, Integer.MAX_VALUEeste valoarea maximă pe care o intpoate stoca în Java. Dacă atingeți Integer.MAX_VALUEși creșteți această valoare, reveniți la Integer.MIN_VALUE, sau mai degrabă, la cea mai mică Integervaloare posibilă. Astfel, pentru a finaliza această sarcină Java, trebuie pur și simplu să atribuim variabilei cu 1 mai puțin decât intvaloarea maximă start. Cod Java pentru această sarcină:
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            // Infinite loop
            System.out.println(i); // Be sure we are in an infinite loop
        }
    }
}
Ce se întâmplă? Începem cu start=2147483645 (Integer.MAX_VALUE-1). În următoarea iterație, valoarea devine 2147483645, apoi 2147483646, apoi -2147483648, -2147483647... și așa mai departe.

Sarcina 2: Creați un comentariu executabil

Ei bine, iată-ne! Încă de la primele lecții, am auzit că comentariile nu sunt executate. De aceea se numesc comentarii. Credem că soluția la această sarcină nu va fi întotdeauna evidentă pentru programatorii Java, chiar și pentru cei experimentați. Cu toate acestea, există o modalitate dificilă (dar „legală”) de a face JVM-ul să execute un comentariu. Poți simți încotro ne îndreptăm? Încercați să ghiciți!

Soluţie

Cod Java pentru această sarcină:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Dacă introducem acest cod Java într-un IDE, iată ce vom obține:
executable comment
Acest lucru se datorează faptului că compilatorul Java interpretează caracterul Unicode \u000dca pe o linie nouă și citește codul nostru astfel: Cod Java pentru această sarcină, așa cum este interpretat de compilator:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Sarcina 3: Creați o buclă denumită

Iată un alt membru al seriei intitulată „Probleme practice de programare Java pentru vacile sferice”. În sensul că nu este clar de ce este chiar necesar: nu este probabil ca bucla să fie jignită de faptul că nu i s-a dat un nume. Oricum, este important din alt motiv: limbajul vă permite să denumiți o buclă.

Soluţie

Notă: aceste „nume” sunt cunoscute de unii oameni ca „etichete” și nu sunt recomandate pentru utilizare în practică. Cod Java pentru demonstrarea unei bucle numite
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);
            }
        }
    }
}
Iată ce va fi rezultat dacă rulați programul:
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
De asemenea, puteți utiliza cuvântul cheie continue pentru a reveni la începutul unei bucle numite. Și dacă este necesar, puteți folosi break(sau continue) într-un imbricat if-elsecu o forbuclă pentru a întrerupe mai multe bucle folosind un if-else. Acest lucru va ajuta la evitarea creării unui număr mare de steaguri și verificarea acestora într-o if-elsedeclarație pentru a determina dacă să continuați sau să ieșiți din bucla interioară.

Sarcina 4: Găsiți un singur duplicat într-o matrice de numere întregi

Vi se oferă o matrice cu numere întregi (sau un ArrayList, dacă preferați) care conține fiecare Integerde la 1 la 100. Matricea are un singur element duplicat. Cum îl găsești? Este mai frecvent ca un programator Java să obțină acest tip de sarcină decât cele trei anterioare. Pentru că este vorba mai degrabă de logică decât de cunoștințele tale despre subtilitățile rar folosite ale limbii. Primul tău impuls nestăpânit de a folosi forța brută va trece destul de repede când creierul tău va începe sau când îți dai seama „Sunt un programator. Sunt inteligent”. Singura problemă este că în timpul unui interviu, când ești stresat, acest lucru s-ar putea să nu se întâmple. Așa că gândește-te acum înainte de a te uita la soluție!

Iată algoritmul

Calculați suma tuturor numerelor de la 1 la 100. Credem că știți cum puteți face acest lucru (de exemplu, folosind faimoasa metodă a lui Gauss). Acum calculați suma elementelor din matricea dvs. sau ArrayList. Și... scădeți prima sumă din a doua. Bingo! Numărul rezultat este valoarea elementului duplicat. Cod Java pentru această sarcină folosind un 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();
// Find the sum of all list elements
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("The repeated element is: " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
// Create a list of sequential elements in the interval [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
// Add the value 23 at index 53
        elements.set(53, 23);
        findDuplicate(elements);
    }
}

O alta solutie

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);
        }
        // Add a duplicate to the list
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("The repeated element is: " + dn.findDuplicateNumber(numbers));
    }
}

Sarcina 5: Găsiți un duplicat non-unic într-o matrice de numere întregi

Dacă sarcina anterioară a fost prea ușoară pentru dvs., încercați să faceți aceasta: vi se oferă o listă de numere întregi de la 1 la 100. Există duplicate în ea (mai mult de unul). Cum găsiți elementele care apar de mai multe ori (găsiți elementele și indicați de câte ori apar)?

Soluţie

Aici soluția logică ar fi să folosiți ceva de genul HashMap, deoarece stochează datele în perechi cheie-valoare. Cod pentru această sarcină în Java:
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 <>();
// Use the following rule to populate the Map duplicates:
// the key is the element value, and the value is the number of times it occurs
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
// Remove any elements that don't occur more than once from the Map duplicates
// and store the result as a list (to make it easy to work with in the next step)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
// Write the results for all elements to the result list
        result.forEach(e -> System.out.println(String.format("Element %d  occurs %d times", 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);
    }
}

Concluzie

Există o mulțime de tipuri diferite de sarcini practice Java și nu știți ce fel de puzzle vă va cere să le rezolvați intervievatorul. Dar, orice angajator sensibil înțelege că capacitatea ta de a îndeplini sarcini practice reale , cum ar fi cele pe care le vei întâlni la locul de muncă, este mult mai importantă decât capacitatea ta de a rezolva întrebări truc. Așa că fă acestea cât mai mult posibil. De aceea am creat CodeGym. Material de la geeksforgeeks a fost folosit pentru a crea acest articol.
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu