CodeGym- studenternas bästa vänner är programmeringsuppgifter, Java och uppgiftsvalideraren. Ändå kommer det en tid då varje padawan-utvecklare måste börja gå utanför stigen, uppfinna sina egna miniprojekt och förbereda sig för intervjuer. Man skulle kunna tro att intervjun skulle ha exakt samma praktiska Java-uppgifter som finns i den här kursen. Och så är det i de flesta fall, men vissa företag gillar att ställa knepfrågor eller något obekant. För att undvika att bli skramlade under en stressig intervju är det bra att försöka lösa liknande Java-uppgifter på egen hand hemma.
I den här artikeln kommer vi att utforska 5 sådana knepiga uppgifter. Vi rekommenderar att du först läser igenom villkoren och försöker lösa dem själv. Och en sak till: glöm inte att göra Java-uppgifter i den här kursen varje dag!
- Uppgift 1: Skapa en oändlig loop från grunden
- Uppgift 2: Skapa en körbar kommentar
- Uppgift 3: Skapa en namngiven loop
- Uppgift 4: Hitta en enda dubblett i en uppsättning heltal
- Uppgift 5: Hitta en icke-unik dubblett i en uppsättning heltal
Uppgift 1: Skapa en oändlig loop från grunden
Ett kodblock har tillhandahållits. Lägg till det för att göra slingan oändlig.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 är inte svårt ", säger du. Du har mer än sannolikt hamnat i det här scenariot upprepade gånger: när du slutförde en Java-uppgift skapade du en oändlig loop och var tvungen att tänka på hur du skulle bli av med den. Tja, det här är tvärtom. Här är den knepiga delen: du kan inte ändra själva slingan eller dess utgångsförhållanden. Det finns bara två iterationer. Men de räcker för att skapa en oändlig loop. Det ser ut som att det bara ska köras i två iterationer, men du kan göra det oändligt med överflöde. Har du redan gissat hur?
Lösning
På grund av spillInteger.MAX_VALUE
är det maximala värdet som en int
kan lagra i Java. Om du når Integer.MAX_VALUE
och ökar detta värde, rullar du tillbaka till, Integer.MIN_VALUE
eller snarare, till lägsta möjliga Integer
värde. För att slutföra denna Java-uppgift behöver vi alltså helt enkelt tilldela variabeln 1 mindre än int
maxvärdet . start
Java-kod för denna uppgift:
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
}
}
}
Vad händer? Vi börjar med start=2147483645 (Integer.MAX_VALUE-1). I nästa iteration blir värdet 2147483645, sedan 2147483646, sedan -2147483648, -2147483647... och så vidare.
Uppgift 2: Skapa en körbar kommentar
Nåväl, här är vi! Från de allra första lektionerna har vi hört att kommentarer inte körs. Det är därför de kallas kommentarer. Vi tror att lösningen på denna uppgift inte alltid kommer att vara självklar för Java-programmerare, inte ens erfarna. Det finns dock ett knepigt (men "lagligt") sätt att få JVM att exekvera en kommentar. Kan du ana vart vi är på väg? Försöka gissa!Lösning
Java-kod för denna uppgift:public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d System.out.println("executable comment");
}
}
Om vi anger den här Java-koden i en IDE får vi det här:
executable comment
Detta beror på att Java-kompilatorn tolkar Unicode-tecknet \u000d
som en ny rad och läser vår kod så här: Java-kod för denna uppgift, som den tolkas av kompilatorn:
public class ExecutableComment {
public static void main(String[] args) {
// The comment below will be executed!
// \u000d
System.out.println("comment executed");
}
}
Uppgift 3: Skapa en namngiven loop
Här är en annan medlem i serien med titeln "Praktiska Java-programmeringsproblem för sfäriska kor". I den meningen att det är oklart varför detta ens är nödvändigt: det är inte troligt att slingan kommer att bli förolämpad av att den inte har fått ett namn. Hur som helst, det är viktigt av en annan anledning: språket låter dig namnge en loop.Lösning
Notera: dessa "namn" är kända för vissa människor som "etiketter", och de rekommenderas inte att använda i praktiken. Java-kod för att demonstrera en namngiven looppublic 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);
}
}
}
}
Här är vad som kommer att matas ut om du kör 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 också använda nyckelordet fortsätt för att återgå till början av en namngiven loop. Och om det behövs kan du använda break
(eller continue
) i en kapslad if-else
med en for
loop för att bryta upp flera loopar med en if-else
. Detta kommer att hjälpa till att undvika att skapa ett stort antal flaggor och kontrollera dem i ett if-else
uttalande för att avgöra om du ska fortsätta eller lämna den inre slingan.
Uppgift 4: Hitta en enda dubblett i en uppsättning heltal
Du får en heltalsmatris (eller en ,ArrayList
om du föredrar det) som innehåller varje Integer
från 1 till 100. Matrisen har ett, och bara ett, duplikatelement. Hur hittar du det? Det är vanligare att en Java-programmerare får den här typen av uppgifter än de tre tidigare. För det handlar om logik snarare än dina kunskaper om sällan använda finesser i språket. Din första ohämmade impuls att använda brute force kommer att passera ganska snabbt när din hjärna slår in eller du inser "Jag är en programmerare. Jag är smart." Det enda problemet är att under en intervju, när du är stressad, kanske detta inte händer. Så tänk efter nu innan du tittar på lösningen!
Här är algoritmen
Beräkna summan av alla tal från 1 till 100. Vi tror att du vet hur du kan göra detta (till exempel med Gauss berömda metod). Beräkna nu summan av elementen i din array ellerArrayList
. Och... subtrahera den första summan från den andra. Bingo! Det resulterande numret är värdet på det duplicerade elementet. Java-kod för denna uppgift med 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 annan 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));
}
}
Uppgift 5: Hitta en icke-unik dubblett i en uppsättning heltal
Om den föregående uppgiften var för lätt för dig, försök att göra den här: Du får en lista med heltal från 1 till 100. Det finns dubbletter i den (fler än en). Hur hittar man de element som förekommer mer än en gång (hitta elementen och ange hur många gånger de förekommer)?Lösning
Här skulle den logiska lösningen vara att använda något som en HashMap, eftersom den lagrar data i nyckel-värdepar. Kod för denna uppgift 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);
}
}