CodeGym/Java-blogg/Tilfeldig/Java-oppgaver med en vri: hei, intervjuer!
John Squirrels
Nivå
San Francisco

Java-oppgaver med en vri: hei, intervjuer!

Publisert i gruppen
CodeGym- studentenes beste venner er programmeringsoppgaver, Java og oppgavevalidatoren. Likevel kommer det en tid da hver padawan-utvikler må begynne å gå utenfor allfarvei, finne opp sine egne miniprosjekter og forberede seg på intervjuer. Man skulle tro at intervjuet ville ha nøyaktig de samme praktiske Java-oppgavene som finnes i dette kurset. Og slik er det i de fleste tilfeller, men noen selskaper liker å stille lurespørsmål eller noe ukjent. For å unngå å bli skranglet under et stressende intervju, er det nyttig å prøve å løse lignende Java-oppgaver på egen hånd hjemme.
Java-oppgaver med en vri: hei, intervjuer!  - 1
I denne artikkelen skal vi utforske 5 slike vanskelige oppgaver. Vi anbefaler at du først leser vilkårene og prøver å løse dem selv. Og en ting til: ikke glem å gjøre Java-oppgaver i dette kurset hver dag!

Oppgave 1: Lag en uendelig løkke fra bunnen av

En blokk med kode er gitt. Legg til det for å gjøre løkken uendelig.
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 */
        }
    }
}
" Det er ikke vanskelig, " sier du. Du har mer enn sannsynlig funnet deg selv i dette scenariet gjentatte ganger: mens du fullførte en Java-oppgave, opprettet du en uendelig løkke og måtte tenke på hvordan du skulle bli kvitt den. Vel, dette er omvendt. Her er den vanskelige delen: du kan ikke endre selve løkken eller dens utgangsbetingelser. Det er bare to iterasjoner. Men de er nok til å lage en uendelig løkke. Det ser ut som det bare skal kjøre i to iterasjoner, men du kan gjøre det uendelig ved å bruke overløp. Har du allerede gjettet hvordan?

Løsning

På grunn av overløp Integer.MAX_VALUEer den maksimale verdien som en intkan lagre i Java. Hvis du når Integer.MAX_VALUEog øker denne verdien, ruller du tilbake til Integer.MIN_VALUE, eller rettere sagt, til lavest mulig Integerverdi. Derfor, for å fullføre denne Java-oppgaven, trenger vi ganske enkelt å tildele 1 mindre enn maksimalverdien inttil startvariabelen. Java-kode for denne oppgaven:
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
        }
    }
}
Hva skjer? Vi begynner med start=2147483645 (heltall.MAX_VALUE-1). I neste iterasjon blir verdien 2147483645, deretter 2147483646, deretter -2147483648, -2147483647... og så videre.

Oppgave 2: Lag en kjørbar kommentar

Vel, her er vi! Helt fra de første leksjonene har vi hørt at kommentarer ikke blir utført. Det er derfor de kalles kommentarer. Vi tror at løsningen på denne oppgaven ikke alltid vil være åpenbar for Java-programmerere, selv ikke erfarne. Det er imidlertid en vanskelig (men "lovlig") måte å få JVM til å utføre en kommentar. Kan du fornemme hvor vi er på vei? Prøv og gjett!

Løsning

Java-kode for denne oppgaven:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Hvis vi legger inn denne Java-koden i en IDE, får vi dette:
executable comment
Dette er fordi Java-kompilatoren tolker Unicode-tegnet \u000dsom en ny linje, og leser koden vår slik: Java-kode for denne oppgaven, slik den tolkes av kompilatoren:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Oppgave 3: Lag en navngitt loop

Her er et annet medlem av serien med tittelen "Praktiske Java-programmeringsproblemer for sfæriske kyr". I den forstand at det er uklart hvorfor dette i det hele tatt er nødvendig: det er ikke sannsynlig at løkken vil bli fornærmet av det faktum at den ikke har fått et navn. Uansett, det er viktig av en annen grunn: språket lar deg navngi en loop.

Løsning

Merk: disse "navnene" er kjent for noen mennesker som "etiketter", og de anbefales ikke å bruke i praksis. Java-kode for å demonstrere en navngitt loop
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);
            }
        }
    }
}
Her er hva som blir sendt ut hvis du kjører programmet:
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
Du kan også bruke nøkkelordet fortsett for å gå tilbake til begynnelsen av en navngitt loop. Og om nødvendig kan du bruke break(eller continue) i en nestet if-elsemed en forløkke for å bryte opp flere løkker ved hjelp av en if-else. Dette vil bidra til å unngå å lage et stort antall flagg og sjekke dem i en if-elseuttalelse for å avgjøre om du skal fortsette eller gå ut av den indre sløyfen.

Oppgave 4: Finn et enkelt duplikat i en rekke heltall

Du får en heltallsmatrise (eller en ArrayList, hvis du foretrekker det) som inneholder hver Integerfra 1 til 100. Matrisen har ett, og bare ett, duplikatelement. Hvordan finner du det? Det er mer vanlig at en Java-programmerer får denne typen oppgaver enn de tre foregående. Fordi det handler om logikk snarere enn din kunnskap om sjeldent brukte finesser i språket. Din første uhemmede impuls til å bruke brute force vil passere ganske raskt når hjernen din starter eller du innser "Jeg er en programmerer. Jeg er smart." Det eneste problemet er at under et intervju, når du er under stress, kan det hende at dette ikke skjer. Så tenk nå før du ser på løsningen!

Her er algoritmen

Regn ut summen av alle tall fra 1 til 100. Vi tror du vet hvordan du kan gjøre dette (for eksempel ved å bruke Gauss sin kjente metode). Beregn nå summen av elementene i matrisen eller ArrayList. Og... trekk den første summen fra den andre. Bingo! Det resulterende tallet er verdien av det dupliserte elementet. Java-kode for denne oppgaven ved hjelp av en 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);
    }
}

En annen løsning

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));
    }
}

Oppgave 5: Finn et ikke-unik duplikat i en rekke heltall

Hvis den forrige oppgaven var for enkel for deg, prøv å gjøre denne: Du får en liste over heltall fra 1 til 100. Det er duplikater i den (mer enn én). Hvordan finner du elementene som forekommer mer enn én gang (finn elementene og angi hvor mange ganger de forekommer)?

Løsning

Her vil den logiske løsningen være å bruke noe sånt som et HashMap, fordi det lagrer dataene i nøkkelverdi-par. Kode for denne oppgaven i 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);
    }
}

Konklusjon

Det finnes mange forskjellige typer praktiske Java-oppgaver, og du vet ikke hva slags gåter intervjueren vil be deg løse. Men enhver fornuftig arbeidsgiver forstår at din evne til å fullføre virkelige praktiske oppgaver , som de du vil møte på jobben, er mye viktigere enn din evne til å løse lurespørsmål. Så gjør disse så mye som mulig. Det er derfor vi opprettet CodeGym. Materiale fra geeksforgeeks ble brukt til å lage denne artikkelen.
Kommentarer
  • Populær
  • Ny
  • Gammel
Du må være pålogget for å legge igjen en kommentar
Denne siden har ingen kommentarer ennå