Bardzo często patrzę na coś zbyt idealistycznie, a później okazuje się, że nie uwzględniłem istotnych parametrów. Skąd wiadomo, ze np. rozwiązanie 1 jest lepsze od rozwiązania 2 ew. 3. Przypuśćmy mamy zadanie:
Napisz kod, który odczytuje sekwencję liczb całkowitych i wyświetla wartość "true", jeśli sekwencja jest uporządkowana (w kolejności rosnącej lub malejącej), w przeciwnym razie "false".
Pamiętaj, że jeśli liczba ma taką samą wartość jak kolejna liczba, nie powoduje to zerwania kolejności.
Sekwencja kończy się na 0. Nie traktuj tej liczby jako części sekwencji. Sekwencja ma zawsze co najmniej jedną liczbę (z wyłączeniem 0).
No i na szybko rozwiązałem to tak(1):
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num;
int prev = 0;
boolean asc = false;
boolean dsc = false;
boolean result = true;
while (scanner.hasNextInt()) {
num = scanner.nextInt();
if (num == 0) {
break;
} else if (prev > num) {
if (!asc && !dsc) {
dsc = true;
} else if (asc) {
result = false;
}
} else if (prev < num && prev != 0) {
if (!asc && !dsc) {
asc = true;
} else if (dsc) {
result = false;
}
}
prev = num;
}
System.out.println(result);
}
}
Jednak kod wydawal mi sie przydlugi i napisalem to(2):
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int previousNumber = scanner.nextInt();
boolean isAscending = true;
boolean isDescending = true;
while (true) {
int number = scanner.nextInt();
if (number == 0) {
break;
}
if (previousNumber > number) {
isAscending = false;
} else if (previousNumber < number) {
isDescending = false;
}
previousNumber = number;
}
System.out.println(isAscending || isDescending);
}
}
W strzeciej wersji uzylem Array.List:
import java.util.*;
class Main {
public static void main(String[] args) {
// put your code here
Scanner scanner = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
while (true) {
int num = scanner.nextInt();
if (num == 0) {
break;
}
list.add(num);
}
List<Integer> copyList = new ArrayList<>(list);
Collections.sort(copyList);
if (list.equals(copyList)) {
System.out.println("true");
} else {
Collections.reverse(copyList);
if (list.equals(copyList)) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
}
Tutaj pytanie, ktore rozwiazanie jest najlepsze/najbardziej odpowiednie? Gdzie jest ta granica udoskanalania kodu. U was w projekach wystarczy, ze dziala? Czy raczej macie z gory ustalone schematy.
UPDATE :D
class Main {
public static void main(String[] args) {
var s = new java.util.Scanner(System.in);
boolean asc= true;
boolean desc = true;
for(int b, a=s.nextInt();(b= s.nextInt())!=0;a=b){
asc &= a<=b;
desc &= a>=b;
}
System.out.println(asc||desc);
}
}