【问题标题】:Making a nested for loop into a single for loop将嵌套的 for 循环变成单个 for 循环
【发布时间】:2016-02-04 20:05:27
【问题描述】:

我有一个任务是创建一个从 10 到 100 的随机数数组。 然后我需要找出数组中未列出的所有数字。 我使用嵌套的 for 循环进行分配,以交叉引用数组,然后将数组中找到的所有数字更改为 -1。最后我打印出数组中不是-1的元素。 我的教授告诉我,我是否可以只使用一个 for 循环来完成这项作业,而无需执行嵌套的 for 循环。并使计算机运行 10,000 次而不是 100 次。 那可能吗?如果有怎么办?

谢谢。

    package assignment.pkg1;

    import java.util.Random;
    public class Assignment1 {

       static Random ran = new Random();

        public static void main(String[] args) {

            int[] arr = new int[100];

            for (int i = 0; i < 100; i++) {
                arr[i] = (ran.nextInt(90)) + 10;
            }

            InversingArray(arr);


        }

        public static void InversingArray(int[] randomArray) {

            int[] fullArray = new int[100];

           for (int i = 0; i < 100; i++) {
                fullArray[i] = i;
            }

            for (int i = 0; i < 100; i++) {
                for (int j = 1; j < 100; j++) {

                    if (randomArray[j] == fullArray[i]) {
                        fullArray[i] = -1;

                    }
                }
           }
            System.out.println("These numbers are not in randomArray: ");
             for (int i = 0; i < 100; i++) {
                if (fullArray[i] != -1) {
                    System.out.println(fullArray[i]);
                }

            }
        }

【问题讨论】:

    标签: java for-loop nested-loops


    【解决方案1】:

    在您的代码中,您创建一个数组来保存可能的值。仔细想想,数组索引总是等于数组中存储的数字。

    fullArray[i] = i;

    这是多余的。

    您被要求做的是确定使用了哪些数字:布尔测试。这意味着您应该有一个初始为 false 的布尔数组(java 中布尔值的默认值),并且当一个相等的整数被翻转为 true 时被翻转为 true。

    类似

    int[] arr = new int[100];
    
    for (int i = 0; i < 100; i++) {
            arr[i] = (ran.nextInt(90)) + 10;
    }
    
    // ba starts with all false values 
    boolean ba[] == new boolean[90];  // note that the instructor said 10-100
    for(int i=0; i<90; i++) {
      ba[arr[i]] = true;
      // lets assume arr[0] == 45
      // ba[arr[0]] is the same as ba[45]
      // ba[45] = true;  will set that bucket of the boolean array to true 
    }
    
    System.out.println("These numbers are not in randomArray: ");
    for (int k = 0; k < 10; k++) {
        System.out.println(k);
    }
    for (int j = 0; j < 90; j++) {
        if (!ba[j]) { // shorthand for ba[j]==false
            System.out.println(j+10); // The array starts at a base of 10
        }
    }
    

    请注意(可能是练习的重点)您正在使用表示数字 [10..100] 的数组 [0..90]。

    【讨论】:

    • 但是如何摆脱嵌套的 for 循环呢?难道我还不需要将每个 ba[i] 与每个 randomArray[i] 交叉引用吗?
    • 否,通过数组为每一项设置对应的布尔值。我会在里面放一些 cmets 应该会有所帮助。
    • 好的,非常感谢,他还希望我们打印出数组中0-100之间的所有值,所以显然包括0-9
    • 那具体取决于你的导师。作为另一个问题发布,应该有人可以提供帮助。
    • 使用从 0 到 89 的数组索引,但使用值从 10 到 99 的数字对其进行索引,保证数组索引异常。最简单的修复:制作ba[] = new boolean[100]。奖励:它自动占 0-9。
    【解决方案2】:

    嵌套循环当前如下所示:

    for (int i = 0; i < 100; i++) {
        for (int j = 1; j < 100; j++) {
            if (randomArray[j] == fullArray[i]) {
                fullArray[i] = -1;
            }
        }
    }
    

    但我们知道,fullArray[i] 始终与 i 相同。

    所以你可以把它改写成:

    for (int j = 1; j < 100; j++) {
        int i = randomArray[j];
        fullArray[i] = -1;
    }
    

    甚至更短:

    for (int j = 1; j < 100; j++) {
        fullArray[randomArray[j]] = -1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2021-09-15
      • 2015-01-28
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多