Siaran ini ditujukan terutamanya untuk mereka yang bersedia untuk temu duga. Di sinilah mereka suka bertanya teka-teki sebegini. Malah, tugas yang dihadapi lebih mudah dan lebih logik untuk diselesaikan dengan kitaran dan keadaan. Dan kami berpendapat bahawa mana-mana pelajar JavaRush akan dapat melakukan ini selepas peringkat keempat pencarian Java Syntax . Tetapi sebahagian besar kaedah di atas direka untuk mereka yang telah "memasuki" Java Multithreading . Nota: Ini adalah tentang tidak menggunakan gelung dan syarat secara langsung. Malah, ia secara tersirat "terbina dalam" kebanyakan penyelesaian yang disebutkan.
Mungkin anda mempunyai penyelesaian anda sendiri untuk masalah ini? Kongsi dalam komen! |
Jadi, kaedah 1: tulis sahaja!
Sudah tentu, perkara pertama yang terlintas di fikiran pemula ialah carian terus. Tidak rasional, tetapi mudah dan boleh difahami. Tepat dengan cara yang sama kami menyelesaikan masalah dalam tahap pertama 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");
Tetapi, anda mesti mengakui, ia entah bagaimana membosankan. Oleh itu, anda boleh menggunakan kaedah kedua.
Kaedah 2: gunakan rentetan dan gantikan kepadaString
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));
}
Anotasi @Override
menunjukkan bahawa kita akan mengatasi kaedah kelas asas. Dalam kes ini kita mengatasi toString
. Malah, ini, seperti hampir semua penyelesaian berikut, mengandungi gelung. Kitaran ini hanya dibina ke dalam kaedah yang digunakan.
Kaedah 3: gunakan rekursi
Untuk memahami rekursi, anda perlu memahami rekursi. Rekursi, atau fungsi yang memanggil dirinya sendiri, adalah topik yang sangat menarik, dan tidak selalu dapat difahami dengan segera. Pada JavaRush, ia diliputi dalam pencarian Java Collections (untuk kesempurnaan), tetapi sebenarnya ia boleh difahami dan digunakan (atau tidak digunakan... mengapa - anda akan mengetahui semasa mempelajari topik itu!) lebih awal, sejurus selepas mempelajari gelung dan lompat bersyarat.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
}
}
Catatan:di sini output dibuat bukan secara langsung, tetapi dalam susunan terbalik. Cuba tukar kod supaya nombor dipaparkan seperti yang dinyatakan dalam syarat, iaitu, dari 1 hingga 100. Kami sedang menunggu penyelesaian dalam komen! |
Kaedah 4: gunakan semaphore
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();
}
}
Semaphore ialah cara penyegerakan untuk mengakses sumber. Di Jawa, semaphore diwakili olehSemaphore
perpustakaanjava.util.concurrent
.
Kaedah 5: gunakan benang
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);
}
}
Kaedah 6: Kenali perpustakaan anda!
Java mempunyai banyak perkara yang menarik. Contohnya, kelasjava.util.BitSet
. Ia membolehkan anda mencipta vektor bit yang saiznya berubah secara dinamik. Iaitu, objek kelas BitSet
ialah set bit tertib tertentu dengan nilai true
atau false
. Pada mulanya semua bit adalah sama false
. Untuk menyimpan set, jumlah memori yang diperlukan untuk menyimpan vektor sehingga bit paling ketara yang ditetapkan atau ditetapkan semula dalam program diperuntukkan - semua bit yang melebihinya dianggap sama 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);
}
}
Kaedah 7: Gunakan kelas Vektor
Ya, kelas vektor sudah usang dan jarang digunakan. Namun, mengapa tidak?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);
}
}
Berdasarkan bahan dari Quora
GO TO FULL VERSION