2016-02-04 2 views
1

У меня было задание создать массив случайных чисел от 10-100. Затем мне нужно разобрать все числа, не перечисленные в массиве. Я выполнил назначение с помощью вложенных циклов, чтобы перекрестно ссылаться на массивы, затем я изменил все найденные числа в массиве на -1. Наконец, я напечатал элементы в массиве, которые не были равны -1. Мой профессор сказал мне, что это возможно для меня сделать это назначение только с одним циклом, и нет необходимости делать вложенный цикл. и заставить компьютер работать 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]); 
       } 

      } 
     } 

ответ

1

В коде вы создаете массив для хранения возможных значений. Если вы подумаете об этом, индекс массива всегда будет равен числу, хранящемуся в массиве.

fullArray[i] = i;

Это является излишним.

Что вам предлагается сделать, это определить, какие числа были использованы: логический тест. Это означает, что у вас должен быть массив логических значений, который изначально был ложным (значение по умолчанию для booleans в 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 
    } 
} 

Будьте в курсе (вероятно, точка упражнения), что вы работаете с массивом [0..90], который представляет число [10..100].

+0

ли это помощь? –

+0

, но как бы избавиться от вложенного цикла? Разве мне не нужно было бы перекрестно ссылаться на каждый ба [i] с каждым случайным массивом [i]? –

+0

Нет, пройти через массив, чтобы установить соответствующее логическое значение для каждого элемента. Я бы добавил несколько комментариев, которые должны помочь. –

0

Вложенный цикл в настоящее время выглядит следующим образом:

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^