Сравнение/сортировка элементов, а затем их возведение в квадрат с использованием списка массивов со сложностью O(n)

#java

Вопрос:

У меня есть вложенный цикл , который проходит через каждый элемент в списке, сравнивая его/сортируя, затем я пытаюсь возвести числа в квадрат в списке(имейте в виду, что их нужно отсортировать). Проблема в том, что когда я запускаю свою программу, список массивов «тест», который я использую, не печатает последний в квадрате, но дважды печатает предпоследний в квадрате. Например, если мой список массивов равен (1,2,3,4,5), мой код должен выводить (1,4,9,16,25), но вместо этого он выводит (1,4,9,16,16). Я, кажется, не могу понять, почему.

Мой код:

 public static void sortSquares(Listlt;Integergt; tempList) {  int result = 0;  for (int i = 0; i lt; tempList.size(); i  ) {  for (int j = tempList.size() - 1; j gt; i; j--){  if (tempList.get(i) gt; tempList.get(j)) {  result = tempList.get(j) * tempList.get(j);  }  else if (tempList.get(j) gt; tempList.get(i)) {    result = (tempList.get(i) * tempList.get(i));    }    }  System.out.println(result);  }  }  

Ответ №1:

Решение не будет работать, если tempList[i] == tempList[j] заменить else if на else , и оно будет работать.

Комментарии:

1. Спасибо за помощь!, Еще один небольшой вопрос, если бы я хотел преобразовать вывод, чтобы он печатался следующим образом: [1,4,9,16,25] вместо создания новой строки, как бы я это сделал?

2. Вы можете сохранить строку и добавить к ней. String s = "[" . Вместо System.out.println(result) этого вы можете сделать s = i == tempList.length - 1 ? result "]" : result "," и System.out.print(s) в конце. Вы можете оптимизировать его дальше, используя StringBuilder класс для добавления в строку.

Ответ №2:

В последнем внешнем цикле, когда i = 4 внутренний цикл становится:

 for (int j = 4; j gt; 4; j--)  

который ничего не делает, и печатается внешний цикл result , содержащий предыдущее значение (16).

Решением может быть замена условия для внутреннего цикла на j gt;= i . Вам также необходимо заменить условие на if , так как tempList.get(j) теперь оно будет равно tempList.get(i) :

 for (int i = 0; i lt; tempList.size(); i  ) {  for (int j = tempList.size() - 1; j gt;= i; j--){  if (tempList.get(i) gt; tempList.get(j)) {  result = tempList.get(j) * tempList.get(j);  }  else if (tempList.get(j) gt;= tempList.get(i)) {  result = (tempList.get(i) * tempList.get(i));  }  }  System.out.println(result); }  

Это будет работать для (1,2,3,4,5).

Тем не менее, того же результата можно было бы достичь с помощью более простого кода:

 Collections.sort(tempList); /* Optional, if you want to sort the result */ Listlt;Integergt; result = new ArrayListlt;gt;(); for (int i = 0; i lt; tempList.size(); i  ) {  result.add(tempList.get(i) * tempList.get(i)); } System.out.println(result);  

Комментарии:

1. Спасибо за помощь!, Еще один небольшой вопрос, если бы я хотел преобразовать вывод, чтобы он печатался следующим образом: [1,4,9,16,25] вместо создания новой строки, как бы я это сделал?

2. Я обновил пример. Вам просто нужно поместить весь результат в список массивов, и результат будет именно таким, как вы хотите.