0

我正在学习 Java,但我对 for 循环的了解似乎很薄弱。

我应该打电话printSquare(1, 5);。我想要的输出是:

12345
23451
34512
45123
51234

我试过了:

public void printSquare(int min,int max){

    for(int i=min;i<=max;i++){
        for(int j=i;j<=max;j++){
          System.out.print(j);
        }
        System.out.println();
    }
}

这给了我:

12345
2345
345
45
5

然后我尝试再插入 2 个循环,但它似乎不起作用。

如果您不给我完整的答案,我将不胜感激,因为那不是学习的方式。我希望提供一些有关如何完成此任务的线索。

4

7 回答 7

2

您应该再添加一个嵌套在i循环中但在循环之外的j循环。

应该是从mini-1

于 2013-04-18T06:16:52.103 回答
1

尝试

public static void printSquare(int min, int max) {

    int x = max - min + 1;

    for (int i = min; i <= max; i++) {
        int counter = i;
        for (int j = 0; j < x; j++) {
            System.out.print(counter);
            counter = counter >= max ? min : counter + 1;
        }
        System.out.println();
    }
}
于 2013-04-18T06:20:38.730 回答
1

因此,您似乎从 8 个答案中得到了解决方案。:)

我只想对此进行测试,看看哪个更快(我的)或 3 循环方法。

这是代码(您不必以任何方式理解它),除了一种方法 - printSquare(int number)是唯一与您相关的方法。其余的与卡尺框架有关——我用它来测量一些结果。

import com.google.caliper.Param;
import com.google.caliper.Runner;
import com.google.caliper.SimpleBenchmark;



public class Measure extends SimpleBenchmark {
     public static void main(String[] args) {
         Runner.main(Measure.class, args);
     }

     @Param({"1"})
     private int mins;

     @Param({"4","7","9"})
     private int maxs;

    public void timePrintSquare3Loops(int reps){
        for(int i=0;i<reps;++i){
            printSquareTwo(mins, maxs);
        }
    }

    public void timePrintSquareMine(int reps){
        for(int i=0;i<reps;++i){
            printSquareOne(mins, maxs);
        }
    }

    public void timePrintSquareTwoLoops(int reps){
        for(int i=0;i<reps;++i){
            printSquareTwoLoops(mins, maxs);
        }
    }


    /**
     * the general solution with 3 loops
     */
     public void printSquareTwo(int min,int max){
         for(int i=min;i<=max;i++){
             for(int j=i;j<=max;j++) System.out.print(j);
             for(int k=min;k<i;k++)  System.out.print(k);           
         }
     }

    public static void printSquareTwoLoops(int min, int max) {
        int x = max - min + 1;
        for (int i = min; i <= max; i++) {
            int counter = i;
            for (int j = 0; j < x; j++) { 
                System.out.print(counter);
                counter = counter >= max ? min : counter + 1;
            }
            System.out.println();
        }
    }

    /**
     * If you know the number upfront. for example 345678.
     *    345678-3*10000=45678=>most significatDigit=3, difference = 45678. 
     *    number = 45678*10 + significatDigit=456783
     *    
     *    And so on..
     * 
     */
     public void printSquareOne(int min, int max){
         StringBuilder sb = new StringBuilder();
         for(int i=min;i<=max;++i){sb.append(i);}
             int number = Integer.valueOf(sb.toString());
             int howMany = (""+number).length();        
             for(int i=0;i<howMany;++i){
                 int pow = (int)Math.pow(10, (howMany-1));
                 int mostSignificantDigit = 0;
                 int intermediarResult = number;
                 do {
                     ++mostSignificantDigit;
                     intermediarResult = intermediarResult - pow;
                 } while (intermediarResult>pow);
                 number = intermediarResult * 10 + mostSignificantDigit;
                 System.out.println(number);
            }    
     }
}

我进行了一些测试。

编辑我还在测试中添加了@Arun P Johny 方法。

这是输出:

 4      PrintSquare3Loops  32.4 =====
 4        PrintSquareMine  20.7 ===
 4    PrintSquareTwoLoops  38.4 ======
 4 PrintSquareCollections  31.8 =====
 7      PrintSquare3Loops  92.9 ==============
 7        PrintSquareMine  36.8 =====
 7    PrintSquareTwoLoops 102.6 ================
 7 PrintSquareCollections 104.8 ================
 9      PrintSquare3Loops 166.2 ==========================
 9        PrintSquareMine  41.7 ======
 9    PrintSquareTwoLoops 187.5 ==============================
 9 PrintSquareCollections 147.7 =======================

似乎一个接一个的3个循环对性能没有那么好。我在这里谈论内存,我相信我的会使用更多。

于 2013-04-18T08:22:42.867 回答
1

我认为你可以在 j 之外尝试第二个循环

public void printSquare(int min,int max){

    for(int i=min;i<=max;i++){

        for(int j=i;j<=max;j++){
          System.out.print(j);
        }
        for(int k=min;k<i;k++){
          System.out.print(k);
        }

    System.out.println();
  }
}
于 2013-04-18T06:22:30.567 回答
0

我不赞成让学生完全实施,但这次我做了一些与 OP 建议不同的事情。希望他能学到一些东西。

public class RingGroupPrint {
  public static void printSquare(int min,int max){
    LinkedList<Integer> list = new LinkedList<Integer>();
    for (int a=min; a<=max; a++) {
      list.add(a);
    }

    for (int i= 0, amount = max-min +1; i<amount; i++ ){
      for (Integer val: list) {
        System.out.print(val);
      }
      list.offerLast(list.pollFirst());
      System.out.println();
    }
  }

  public static void main(String[] args) {
    printSquare(1, 5);
  }
}

我并不声称它比简单的 2 for 实现是最佳的或更好的。它使用Java的集合,是一个很好的学习资料。我希望。

于 2013-04-18T07:02:47.383 回答
0

看到这个逻辑,它执行所需的操作,它是通用的,适用于 min、max 的任何 +ve 值:

for(int i=min;i<=max;i++){
    for(int j=min;j<=max;j++){
        int val = (j + i - min);
            if (val >max ){
                val -= max - min + 1;
            }
            System.out.print(val);
        }
    }
于 2013-04-18T06:32:33.490 回答
-1

在您的代码中添加另一个循环。尝试这个:

public void printSquare(int min, int max) {
        for (int i = min; i <= max; i++) {
            int j = i;
            for (j = i; j <= max; j++) {
                System.out.print(j);
            }
            for (int k = j - i, l = min; k < max; k++, l++) {
                System.out.print(l);
            }

            System.out.println();
        }
}
于 2013-04-18T06:30:26.050 回答