JavaRush /จาวาบล็อก /Random-TH /จะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 100 ใน Java โดยไม่มีลูปและเงื่...

จะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 100 ใน Java โดยไม่มีลูปและเงื่อนไขได้อย่างไร

เผยแพร่ในกลุ่ม
โพสต์นี้มีไว้สำหรับผู้ที่เตรียมตัวสัมภาษณ์เป็นหลัก ที่นี่พวกเขาชอบถามปริศนาประเภทนี้ ในความเป็นจริง งานที่ทำอยู่นั้นง่ายกว่าและมีเหตุผลมากกว่าในการแก้ไขตามรอบและเงื่อนไข และเราคิดว่า นักเรียน JavaRush ทุกคน จะสามารถทำได้หลังจาก ภารกิจ Java Syntax ระดับ ที่ สี่ แต่วิธีการข้างต้นส่วนใหญ่ได้รับการออกแบบสำหรับผู้ที่ "เข้าสู่" Java Multithreadingแล้ว หมายเหตุ: นี่เป็นการไม่ใช้ลูปและเงื่อนไขโดยตรง ในความเป็นจริงแล้ว โซลูชั่นส่วนใหญ่ที่กล่าวถึงนั้น "มีอยู่ใน" โดยปริยาย จะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 100 ใน Java โดยไม่มีลูปและเงื่อนไขได้อย่างไร  - 1
บางทีคุณอาจมีวิธีแก้ไขปัญหานี้เอง? แบ่งปันในความคิดเห็น!

ดังนั้นวิธีที่ 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ครอบคลุมอยู่ใน ภารกิจ Java Collections (เพื่อความสมบูรณ์) แต่ในความเป็นจริง มันสามารถเข้าใจและใช้งานได้ (หรือไม่ใช้... ทำไม - คุณจะค้นพบในขณะที่ศึกษาหัวข้อนี้!) เร็วขึ้นมาก ทันทีหลังจากศึกษาลูป และการกระโดดแบบมีเงื่อนไข
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();
    }
}
เซมาฟอร์เป็นวิธีการซิงโครไนซ์สำหรับการเข้าถึงทรัพยากร ใน Java เซมาฟอร์จะถูกแสดงโดยคลาส 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 มีสิ่งที่น่าสนใจมากมาย ตัวอย่างเช่น คลาส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
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION