این پست در درجه اول برای کسانی است که برای مصاحبه آماده می شوند. اینجاست که دوست دارند از این نوع پازل ها بپرسند. در واقع، کار در دست آسان تر و منطقی تر برای حل با چرخه ها و شرایط است. و ما فکر می کنیم که هر دانش آموز JavaRush می تواند این کار را بعد از مرحله چهارم جستجوی JavaSyntax انجام دهد . اما اکثریت قریب به اتفاق روشهای فوق برای کسانی طراحی شدهاند که قبلاً به Java Multithreading وارد شدهاند . توجه: این در مورد عدم استفاده مستقیم از حلقه ها و شرایط است. در واقع، آنها به طور ضمنی در اکثر راه حل های ذکر شده "ساخته شده اند".
شاید شما راه حل خود را برای این مشکل دارید؟ در نظرات به اشتراک بگذارید! |
بنابراین، روش 1: فقط آن را بنویسید!
البته اولین چیزی که به ذهن یک مبتدی می رسد جستجوی مستقیم است. غیر منطقی، اما ساده و قابل درک. دقیقاً به همان روشی که در سطوح اول 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");
اما، باید اعتراف کنید، به نوعی خسته کننده است. بنابراین می توانید از روش دوم استفاده کنید.
روش 2: از رشته ها استفاده کنید و 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));
}
حاشیه نویسی @Override
نشان می دهد که ما یک متد کلاس پایه را لغو می کنیم. در این مورد ما نادیده می گیریم toString
. در واقع، این، مانند تقریباً همه راه حل های زیر، حاوی حلقه هایی است. این چرخه ها به سادگی در روش های مورد استفاده قرار می گیرند.
روش 3: از بازگشت استفاده کنید
برای درک بازگشت، باید بازگشت را درک کنید. بازگشت، یا تابعی که خود را فراخوانی می کند، موضوع بسیار جالبی است و همیشه بلافاصله قابل درک نیست. در JavaRush در جستوجوی مجموعههای جاوا (برای کامل بودن) پوشش داده میشود ، اما در واقع میتوان آن را فهمید و استفاده کرد (یا استفاده نکرد... چرا - در حین مطالعه موضوع متوجه خواهید شد!) خیلی زودتر، بلافاصله پس از مطالعه حلقهها. و پرش های مشروط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
}
}
توجه داشته باشید:در اینجا خروجی نه به صورت مستقیم، بلکه به ترتیب معکوس ساخته می شود. سعی کنید کد را طوری تغییر دهید که اعداد طبق شرط نمایش داده شوند، یعنی از 1 تا 100. منتظر راه حل ها در نظرات هستیم! |
روش 4: از سمافورها استفاده کنید
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
کتابخانهjava.util.concurrent
.
روش 5: از نخ ها استفاده کنید
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);
}
}
روش 6: کتابخانه های خود را بشناسید!
جاوا چیزهای جالب زیادی دارد. به عنوان مثال، کلاسjava.util.BitSet
. این به شما اجازه می دهد تا بردار بیتی ایجاد کنید که اندازه آن به صورت پویا تغییر می کند. به این معنا که یک شیء کلاس BitSet
مجموعه ای مرتب از بیت ها با مقادیر 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);
}
}
روش 7: از کلاس Vector استفاده کنید
بله، کلاس برداری منسوخ شده است و بسیار کم استفاده می شود. با این حال، چرا که نه؟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
GO TO FULL VERSION