Permalänk

Java nybörjarhjälp

Hej, jag har börjat kolla lite på Java via lite olika online "tutorials". Men på en av sidorna fanns det en uppgift vilken bestod av att plocka fram det näst största talet ur en array.

på uppgiften innan så skulle man leta upp det minsta talet och det löste jag så här:

int smallest = ar[0]; for(i=0; i < ar.lenght; i =i+1){ if (ar[i] < smallest){ smallest=ar[i] } }

Men hur tusan får jag ut det näst minsta talet? Jag har försökt få till något i stil med "&& > smallest" men kommer inte på hur jag ska lösa detta.

Permalänk
Medlem

Edit: missade att du ville ha näst minsta
Ett tips är att kolla på bubblesort.

for (int i = 0; i < num.length; i++) { for (int x = 1; x < num.length - i; x++) { if (num[x - 1] > num[x]) { int temp = num[x - 1]; num[x - 1] = num[x]; num[x] = temp; } } }

Visa signatur

i7-6700K | MSI Z170A | MSI 1080 8GB | 16GB Kingston HyperX | Intel 600P 256GB | Samsung EVO Basic 840 250GB x2 raid 0 | Corsair RM 750W | 3 x Dell U2414H

Permalänk
Inaktiv

int minst = INTEGER.MAX_VALUE int näst_minst = INTEGER.MAX_VALUE int störst= INTEGER.MIN_VALUE för alla tal i arrayen är talet mindre än näst_minst? näst_minst = talet är talet mindre än minst? näst_minst = minst minst = talet end end end

EDIT: Läste inte allt. För att få med det näst minsta talet måste du spara både det näst minsta och det minsta talet.

Permalänk

Nu har han ju löst problemet med minsta talet. Men nu söker han näst minsta. En väldigt enkel lösning på detta bör vara att sortera listan i storleksordning och sedan ta den som motsvarar positionen näst minst.

Permalänk
Inaktiv
Skrivet av SORRYFORCAPS:

Nu har han ju löst problemet med minsta talet. Men nu söker han näst minsta. En väldigt enkel lösning på detta bör vara att sortera listan i storleksordning och sedan ta den som motsvarar positionen näst minst.

Är det en programmeringsövning tror jag inte det är tillåtet att skriva "return Arrays.sort(ar)[1]";

Permalänk
Medlem
Skrivet av burton666:

Men hur tusan får jag ut det näst minsta talet? Jag har försökt få till något i stil med "&& > smallest" men kommer inte på hur jag ska lösa detta.

Du får hålla koll på två saker:
Om du hittar ett nytt minsta tal så är det föregående minsta talet nu det näst minsta talet.
Samt, om du hittar ett tal som är större än (eller lika med) det minsta talet men mindre än det näst minsta talet, så är det nu det näst minsta talet. (med specialfallet att om talet är större än det minsta talet och du inte har hittat något näst minsta tal än så är det nu det näst minsta talet)

public static Integer findSecondSmallest(int ls[]) { Integer smallest=ls[0]; Integer secondSmallest=null; for(int i=1; i < ls.length; i++) { int v=ls[i]; if(v < smallest) { secondSmallest=smallest; smallest=v; } else if(secondSmallest==null || v<secondSmallest) { secondSmallest=v; } } return secondSmallest; }

Skrivet av anon81912:

int minst = INTEGER.MAX_VALUE int näst_minst = INTEGER.MAX_VALUE int störst= INTEGER.MIN_VALUE för alla tal i arrayen är talet mindre än näst_minst? näst_minst = talet är talet mindre än minst? näst_minst = minst minst = talet end end end

EDIT: Läste inte allt. För att få med det näst minsta talet måste du spara både det näst minsta och det minsta talet.

Du borde inte blanda in INT_MAX i det här, då det inte behövs (och då den kommer göra fel om arrayen består av mindre än två tal) samt blir det svårare att portera lösningen till annan data där du inte har något MAX eller MIN värde tillgängligt.

Ex ovanstående förslag på lösning kan man ju lätt skriva om till generics varianten:

public static <T extends Comparable> T findSecondSmallest(T ls[]){ T smallest = ls[0]; T secondSmallest = null; for(int i=1; i < ls.length; i++) { T v=ls[i]; if(v.compareTo(smallest)<0) { secondSmallest=smallest; smallest=v; } else if(secondSmallest==null || v.compareTo(secondSmallest)<0) { secondSmallest=v; } } return secondSmallest; }

Dold text

Medan en lösning som förlitar sig på MAX och MIN värden som startvärden enbart kommer fungera i vissa specifika fall.

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Skrivet av burton666:

Hej, jag har börjat kolla lite på Java via lite olika online "tutorials". Men på en av sidorna fanns det en uppgift vilken bestod av att plocka fram det näst största talet ur en array.

på uppgiften innan så skulle man leta upp det minsta talet och det löste jag så här:

int smallest = ar[0]; for(i=0; i < ar.lenght; i =i+1){ if (ar[i] < smallest){ smallest=ar[i] } }

Men hur tusan får jag ut det näst minsta talet? Jag har försökt få till något i stil med "&& > smallest" men kommer inte på hur jag ska lösa detta.

Ha två variabler, en för minsta talet och en för näst minsta. kontrollera mot dem och flytta talen på lämpligt sätt när det behövs. Du gör ungefär likadant som du redan gjort...

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem
Skrivet av gn1p:

Edit: missade att du ville ha näst minsta
Ett tips är att kolla på bubblesort.

Bubblesort är ju inte att rekommendera imo, i och med att tidskomplexiteten i värstafall och medelfall är O(n^2). Nu vet jag att vi snackar nybörjarprogrammering, men det kan vara bra att redan från början tänka i banor om körtid. Skulle man i det här fallet vilja beta igenom större arraylistor sticker körtiden iväg utav bara sjutton.

Men som andra nämnt tidigare är det inte nödvändigt att använda sig av sorteringsalgoritmer för att lösa problemet, räcker som sagt med att ha två variabler där man sparar det största och näst största talet allteftersom man går igenom arrayen.

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Datavetare
Skrivet av RedRetro:

Bubblesort är ju inte att rekommendera imo, i och med att tidskomplexiteten i värstafall och medelfall är O(n^2). Nu vet jag att vi snackar nybörjarprogrammering, men det kan vara bra att redan från början tänka i banor om körtid. Skulle man i det här fallet vilja beta igenom större arraylistor sticker körtiden iväg utav bara sjutton.

Men som andra nämnt tidigare är det inte nödvändigt att använda sig av sorteringsalgoritmer för att lösa problemet, räcker som sagt med att ha två variabler där man sparar det största och näst största talet allteftersom man går igenom arrayen.

Håller absolut med om att man ska tänka på tidskomplexitet, men en sak som det sällan talas om på utbildningar men som i praktiken kan vara extremt viktigt är den där konstanten som man alltid får lära sig att ignorera

En av de absolut snabbaste sätt man kan sortera saker på är via en kombination av quick-sort O(N*log(N) och insert-sort O(N^2) då den senare må ha usel tidskomplexitet, men den har en extremt effektiv inre loop så den är väldigt snabb för små N. En annan "bra" kombo är att börja med quick-sort och sedan byta till heap-sort (också O(N*log(N)) men typiskt långsammare än quick-sort för stora N).

Nu tror jag TS klara sig väldigt bra med att lösa problemet genom att hålla reda på de två minsta talen. För den som är intresserad så kan man lösa detta problem på ett helt generellt sätt som är O(N + M*log(N)) där N är totala antalet element och M är numret på det element man vill ha. Detta blir ju i praktiken O(N) om N är väsentligt större än M.

Om alla värden initialt är osorterade kan man skapa en binär heap O(N) och sedan plockar man ut M element, varje sådant kostar O(log(N)).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer