Bu yazı ilk növbədə müsahibəyə hazırlaşanlar üçün nəzərdə tutulub. Bu cür tapmacaları soruşmağı xoşlayırlar. Əslində, tapşırığı dövrlər və şərtlərlə həll etmək daha asan və daha məntiqlidir. Və düşünürük ki, hər hansı JavaRush tələbəsi bunu Java Sintaksis axtarışının dördüncü səviyyəsindən sonra edə biləcək . Lakin yuxarıda göstərilən üsulların böyük əksəriyyəti artıq Java Multithreading-ə “daxil olmuş”lar üçün nəzərdə tutulub . Qeyd: Bu, birbaşa döngələrdən və şərtlərdən istifadə etməməyə aiddir. Əslində, onlar qeyd olunan həllərin əksəriyyətində dolayısı ilə "inşa edilir".
Bəlkə bu problemin öz həlli var? Şərhlərdə paylaşın! |
Beləliklə, 1-ci üsul: sadəcə yazın!
Əlbəttə ki, yeni başlayanların ağlına gələn ilk şey birbaşa axtarışdır. Məntiqsiz, lakin sadə və başa düşüləndir. JavaRush-un ilk səviyyələrində problemləri həll etdiyimiz kimi.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");
Ancaq etiraf etməlisən ki, bu, bir növ darıxdırıcıdır. Buna görə də ikinci üsuldan istifadə edə bilərsiniz.
Metod 2: sətirlərdən istifadə edin və toString-i ləğv edin
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));
}
Annotasiya @Override
göstərir ki, biz əsas sinif metodunu ləğv edəcəyik. Bu vəziyyətdə biz üstünlük təşkil edirik toString
. Əslində, bu, demək olar ki, bütün aşağıdakı həllər kimi, döngələri ehtiva edir. Bu dövrlər sadəcə istifadə olunan metodlara daxil edilir.
Metod 3: rekursiyadan istifadə edin
Rekursiyanı başa düşmək üçün rekursiyanı başa düşmək lazımdır. Rekursiya və ya özünü çağıran funksiya çox maraqlı mövzudur və həmişə dərhal başa düşülən deyil. JavaRush -da o, Java Collections axtarışında (tamlıq üçün) əhatə olunub , lakin əslində onu başa düşmək və istifadə etmək olar (yaxud istifadə olunmur... niyə - mövzunu öyrənərkən öyrənəcəksiniz!) çox əvvəl, döngələri öyrəndikdən dərhal sonra. və şərti atlamalar.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
}
}
Qeyd:burada çıxış birbaşa deyil, tərs qaydada aparılır. Kodu dəyişdirməyə çalışın ki, rəqəmlər şərtdə göstərildiyi kimi, yəni 1-dən 100-ə qədər göstərilsin. Şərhlərdə həll yollarını gözləyirik! |
Metod 4: semaforlardan istifadə edin
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();
}
}
Semaforlar resursa daxil olmaq üçün sinxronizasiya vasitəsidir. Semaphore
Java-da semaforlar kitabxanailə təmsil olunurjava.util.concurrent
.
Metod 5: iplərdən istifadə edin
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);
}
}
Metod 6: Kitabxanalarınızı bilin!
Java çox maraqlı şeylərə malikdir. Məsələn, sinifjava.util.BitSet
. O, ölçüsü dinamik olaraq dəyişən bit vektoru yaratmağa imkan verir. Yəni, sinif obyekti və ya BitSet
dəyərləri olan müəyyən bir sıralanmış bit dəstidir . Əvvəlcə bütün bitlər bərabərdir . Dəsti saxlamaq üçün vektoru proqramda təyin edilmiş və ya sıfırlanmış ən əhəmiyyətli bitə qədər saxlamaq üçün tələb olunan yaddaş miqdarı ayrılır - onu aşan bütün bitlər bərabər hesab olunur . true
false
false
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);
}
}
Metod 7: Vector sinfindən istifadə edin
Bəli, vektor sinfi köhnəlib və çox nadir hallarda istifadə olunur. Yenə də niyə olmasın?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);
}
}
Quora materialları əsasında
GO TO FULL VERSION