0
votes

Sommez les éléments dans une liste triée, puis ajoutez la valeur additionnée dans la liste

Alors, voici mon problème, j'ai une liste qui contient quelque chose comme ça [4,7,8,23,41] Ce que je veux c'est 4 + 7 = 11 donc 11 doit être ajouté à cette liste et 4 et 7 doivent être supprimés. puis 11 +8 = 19 donc 19 ajoutés et 11 et 8 doivent être supprimés.

  int finalSum=0;
  Collections.sort(myList);

  for(int i =0;i<myList.size();i++)
  {
      for(int j=i+1;i<myList.size();j++)
      {
          int sum = myList.get(i) + myList.get(j);
          myList.remove(i);
          myList.remove(j);
      }
  }

  for(int k=0;k<myList.size();k++)
  {
       finalSum += myList.get(k); 
  }


2 commentaires

C'est un algorithme terrible. Additionnez simplement la Liste et videz-la. Ce n'est pas une bonne idée de modifier la Liste que vous itérez.


Cela ressemble à quelque chose qu'un instructeur attribuerait.


3 Réponses :


2
votes

Je ne suis pas sûr de la raison pour laquelle vous voudriez un algorithme comme celui-ci, mais il devrait se comporter comme vous l'avez décrit.

public static void main(String[] args) {
    List<Integer> myList = Arrays.asList(4,7,8,23,41);
    int finalSum = myList.stream().reduce(0, Integer::sum);
    System.out.println(finalSum);
}

Une meilleure approche pour additionner les éléments d'une liste serait:

public static void main(String[] args) {
    List<Integer> myList = new LinkedList<>(Arrays.asList(4,7,8,23,41));
    Collections.sort(myList);
    while (myList.size() > 1) {
        myList.add(0, myList.remove(0) + myList.remove(0));
    }
    int finalSum = myList.get(0);
    System.out.println(finalSum);
}


0 commentaires

2
votes

Si vous voulez juste obtenir un total final de la liste, vous pouvez le faire en itérant toute la liste et en ajoutant chaque valeur en même temps.

    PriorityQueue<Integer> pq= new PriorityQueue<>(); // by default it maintains the ascending order
    for(int k=0;k<myList.size();k++){
        pq.add(myList.get(k));
    }
    while(pq.size()>1){
        int num1 = pq.poll(); // taking out first smallest number
        int num2 = pq.poll(); // taking out second smallest number
        pq.add(num1+num2);
    }
    finalSum = pq.poll(); // final sum

Mais, comme vous avez décrit que vous voulez ajouter les deux premiers nombres de la liste, puis il devrait les supprimer, ajoutez le total à la liste et faites le même processus, nous pouvons alors utiliser PriorityQueue ici. Cela peut aider à garder une trace de l'ordre croissant et de toute façon la complexité temporelle de notre code sera O (n logn) où n est la taille de la liste.

for(int k=0;k<myList.size();k++)
{
   finalSum += myList.get(k); 
}


0 commentaires

1
votes

Puisque vous continuez à supprimer des éléments de la liste, vous pouvez continuer à utiliser l'index 0.

      int sum = list.stream().mapToInt(a -> a).sum();

Mais si c'est juste une somme que vous recherchez, c'est plus simple.

      List<Integer> list = new ArrayList<>(Arrays.asList(4,7,8,23,41));

      int first = 0;
      while (list.size() > 0) {
         int v = list.remove(0) + first;
         list.add(0, v);
         System.out.println(list);
         first = list.remove(0);
      }


0 commentaires