Ce poste est principalement destiné à ceux qui se préparent aux entretiens. C'est là qu'ils aiment poser ce genre d'énigmes. En fait, la tâche à accomplir est plus facile et plus logique à résoudre avec des cycles et des conditions. Et nous pensons que n'importe quel étudiant JavaRush sera capable de le faire après le quatrième niveau de la quête Java Syntax . Mais la grande majorité des méthodes ci-dessus sont conçues pour ceux qui sont déjà « entrés » dans Java Multithreading . Remarque : Il s'agit de ne pas utiliser directement les boucles et les conditions. En fait, ils sont implicitement « intégrés » à la plupart des solutions mentionnées.
Peut-être avez-vous votre propre solution à ce problème ? Partagez dans les commentaires ! |
Alors, méthode 1 : écrivez-le !
Bien sûr, la première chose qui vient à l’esprit d’un débutant est la recherche directe. Irrationnel, mais simple et compréhensible. Exactement de la même manière que nous avons résolu les problèmes dans les premiers niveaux de JavaRush.System.out.println("1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 ,
21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 ,
43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 ,
65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 ,
97 , 98 , 99 , 100");
Mais, il faut l’admettre, c’est en quelque sorte ennuyeux. Par conséquent, vous pouvez utiliser la deuxième méthode.
Méthode 2 : utiliser des chaînes et remplacer toString
public static void main(String[] args) {
Object[] numbers = new Object[100];
Arrays.fill(numbers, new Object() { //создаем анонимный класс
private int count = 0;
@Override
public String toString() {
return Integer.toString(++count);
}
});
System.out.println(Arrays.toString(numbers));
}
L'annotation @Override
indique que nous allons remplacer une méthode de classe de base. Dans ce cas, nous annulons toString
. En fait, comme presque toutes les solutions suivantes, elle contient des boucles. Ces cycles sont simplement intégrés aux méthodes utilisées.
Méthode 3 : utiliser la récursivité
Pour comprendre la récursivité, vous devez comprendre la récursivité. La récursivité, ou une fonction qui s'appelle elle-même, est un sujet très intéressant, et pas toujours immédiatement compréhensible. Sur JavaRush, il est abordé dans la quête Java Collections (pour être complet), mais en fait il peut être compris et utilisé (ou non utilisé... pourquoi - vous le découvrirez en étudiant le sujet !) bien plus tôt, immédiatement après avoir étudié les boucles et sauts conditionnels.public class Recursion {
public void ShowNums(int i) {
// метод, который печатает
int x = 1;
// блок try проверяет, достигли ли мы нуля
try {
int m = x / i; // здесь выбрасывается исключение при i = 0
System.out.println(i);
i--;
ShowNums(i); // а вот и рекурсивный вызов
}
catch(ArithmeticException e) {
// деление на нуль выбрасывает ArithmeticException
return; // Останавливается при попытке деления на нуль
}
}
public static void main(String[] args) {
Recursion r = new Recursion();
r.ShowNums(100); // вызов метода со meaningм 100
}
}
Note:ici, la sortie ne se fait pas directement, mais dans l'ordre inverse. Essayez de changer le code pour que les chiffres s'affichent comme indiqué dans la condition, c'est-à-dire de 1 à 100. Nous attendons des solutions dans les commentaires ! |
Méthode 4 : utiliser des sémaphores
public class To100 {
public static void main(String[] args) {
final int max = 100;
new java.util.concurrent.Semaphore(max) {
void go() {
acquireUninterruptibly();
System.err.println(max-availablePermits());
go();
}
}.go();
}
}
Les sémaphores sont un moyen de synchronisation pour accéder à une ressource. En Java, les sémaphores sont représentés par laSemaphore
bibliothèquejava.util.concurrent
.
Méthode 5 : utiliser des threads
public class Counter extends Thread{
private int cnt;
public Counter(){
this.cnt = 0;
}
private void increment(){
System.out.println(cnt++);
try{
Thread.sleep(1000);
}catch(Exception e){}
increment();
}
public void run(){
increment();
}
public static void main(String[] args) throws Exception{
Counter cntr = new Counter();
cntr.start();
cntr.join(100000);
cntr.interrupt();
System.exit(0);
}
}
Méthode 6 : Connaissez vos bibliothèques !
Java a beaucoup de choses intéressantes. Par exemple, la classejava.util.BitSet
. Il permet de créer un vecteur de bits dont la taille change dynamiquement. Autrement dit, un objet de classe BitSet
est un certain ensemble ordonné de bits avec des valeurs true
ou false
. Initialement, tous les bits sont égaux false
. Pour stocker l'ensemble, la quantité de mémoire nécessaire pour stocker le vecteur jusqu'au bit le plus significatif qui a été défini ou réinitialisé dans le programme est allouée - tous les bits qui le dépassent sont considérés comme égaux false
.
public class To100 {
public static void main(String[] args) {
String set = new java.util.BitSet() {{ set(1, 100+1); }}.toString();
System.out.append(set, 1, set.length()-1);
}
}
Méthode 7 : utiliser la classe Vector
Oui, la classe vector est obsolète et est extrêmement rarement utilisée. Pourtant, pourquoi pas ?import java.util.Vector;
public class PrintOneToHundered {
static int i;
PrintOneToHundered() {}
public String toString() { return ++i+""; }
public static void main(String[] args) {
Vector v1 =new Vector(); v1 .add(new PrintOneToHundered());
Vector v2 =new Vector(); v2 .addAll(v1 ); v2 .addAll(v1 );
Vector v4 =new Vector(); v4 .addAll(v2 ); v4 .addAll(v2 );
Vector v8 =new Vector(); v8 .addAll(v4 ); v8 .addAll(v4 );
Vector v16 =new Vector(); v16 .addAll(v8 ); v16 .addAll(v8 );
Vector v32 =new Vector(); v32 .addAll(v16); v32 .addAll(v16);
Vector v64 =new Vector(); v64 .addAll(v32); v64 .addAll(v32);
Vector v100=new Vector(); v100.addAll(v64); v100.addAll(v32); v100.addAll(v4);
System.out.println(v100);
}
}
Basé sur des matériaux de Quora
GO TO FULL VERSION