java 解决此ArrayList问题的最佳方式

dzhpxtsq  于 2023-08-02  发布在  Java
关注(0)|答案(4)|浏览(141)

int [8,4,9,10,34,54,56];
1.查找列表//4的最小值。
1.从列表//[8,4,9]中删除min及其相邻元素。
1.将min加到整数变量sum。对剩余的元素//[10,34,54,56]重复上述步骤。
1.输出为单个整数和=68(4 + 10 + 54)。// remaining element in list is [56]
我尝试了这种方式,这段代码保持运行(不打印任何东西)预期输出:68岁

List<Integer> ques=new ArrayList<>(Arrays.asList(8,4,9,10,34,54,56));
    int l=ques.size();
    int sum=0,min,index;
    while(l>=1){
      min=Collections.min(ques);
      sum+=min;
      index=ques.indexOf(min);
      
      if(index==0 && l>2){
        ques.remove(index);
        ques.remove(index+1);
        l-=2;
      }
      else if(index==0 && l==2){
        ques.remove(index);
        l--;
      }
      else if(index!=0 && l>2){
        ques.remove(index-1);
        ques.remove(index);
        ques.remove(index+1);
        l-=3;
      }
    }
    System.out.println(sum);

字符串

irtuqstp

irtuqstp1#

代码的问题是while循环条件没有正确更新。它当前检查l是否大于或等于1,但它永远不会在循环内部更改l的值。因此,循环将无限期运行,并且永远不会打印任何内容。
要修复代码,您可以根据每次迭代中删除的元素数量在循环中更新l。您还可以通过使用带有适当索引的单个remove()调用来简化if-else语句。
下面是更正的代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> ques = new ArrayList<>(Arrays.asList(8, 4, 9, 10, 34, 54, 56));
        int sum = 0;
        while (ques.size() > 1) {
            int min = Collections.min(ques);
            sum += min;
            int index = ques.indexOf(min);
            if (index == 0) {
                ques.remove(index);
                ques.remove(index);
            } else if (index == ques.size() - 1) {
                ques.remove(index);
                ques.remove(index - 1);
            } else {
                ques.remove(index - 1);
                ques.remove(index - 1);
                ques.remove(index - 1);
            }
        }
        if (ques.size() == 1) {
            sum += ques.get(0);
        }
        System.out.println(sum);
    }
}

字符串

输出

x1c 0d1x的数据

pxyaymoc

pxyaymoc2#

是的,因为你没有在while循环中更新l的值,这会导致一个无限循环,所以你需要在每个条件块中更新l的值,从ques列表中删除元素!
看看这个

List<Integer> ques = new ArrayList<>(Arrays.asList(8, 4, 9, 10, 34, 54, 56));
int l = ques.size();
int sum = 0;
int min, index;

while (l >= 1) {
  min = Collections.min(ques);
  sum += min;
  index = ques.indexOf(min);

  if (index == 0 && l > 2) {
    ques.remove(index);
    ques.remove(index + 1);
    l -= 2;
  } else if (index == 0 && l == 2) {
    ques.remove(index);
    l--;
  } else if (index != 0 && l > 2) {
    ques.remove(index - 1);
    ques.remove(index);
    ques.remove(index + 1);
    l -= 3;
  }
}
System.out.println(sum);

字符串

von4xj4u

von4xj4u3#

你的代码中有四个错误。(实际上,你有三个不同的错误,因为你犯了两次同样的错误。
1.从List中删除一个元素后,列表中的元素减少了一个,并且每个剩余元素的索引都比删除前少了一个。因此,当您这样做时:ques.remove(index);,删除之前位于index + 1的元素现在位于index。你犯了两次这样的错误。
1.当List只有两个元素时,最小元素(即min)处于索引0(零)或索引1(一)。你得把它取出来。(请尝试在List仅包含8和4时运行代码。

  1. while条件将总是为真-因为List永远不会删除其所有元素。这就是为什么 * 代码不断运行 * -它处于无限循环中。因此,条件应该是l > 1
    如果使用调试器单步调试代码,并在每个remove操作之后查看ques的内容,您将看到第一个错误。
    下面是正确的代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Exercise {

    public static void main(String[] args) {
        List<Integer> ques = new ArrayList<>(Arrays.asList(8, 4, 9, 10, 34, 54, 56));
        int l = ques.size();
        int sum = 0, min, index;
        while (l > 1) {
            min = Collections.min(ques);
            sum += min;
            index = ques.indexOf(min);
            if (index == 0 && l > 2) {
                ques.remove(index);
                ques.remove(index);
                l -= 2;
            }
            else if (l == 2) {
                ques.remove(index);
                l--;
            }
            else if (index != 0 && l > 2) {
                ques.remove(index - 1);
                ques.remove(index - 1);
                ques.remove(index - 1);
                l -= 3;
            }
        }
        System.out.println(sum);
    }
}

字符串

dfty9e19

dfty9e194#

如果您关心优化,请记住,从ArrayList中删除元素是非常无效的。您应该考虑更合适的数据结构,如Map

public static void main(String... args) {
    int[] arr = { 8, 4, 9, 10, 34, 54, 56 };
    System.out.println(calcSum(arr));
}

public static int calcSum(int[] arr) {
    Map<Integer, Set<Integer>> map = createMap(arr);
    int sum = 0;

    while (!map.isEmpty()) {
        Map.Entry<Integer, Set<Integer>> min = map.entrySet().iterator().next();
        sum += min.getKey();
        int pos = min.getValue().iterator().next();

        removeElement(pos, arr[pos], map);

        if (pos > 0) removeElement(pos - 1, arr[pos - 1], map);
        if (pos < arr.length - 1) removeElement(pos + 1, arr[pos + 1], map);
    }

    return sum;
}

private static Map<Integer, Set<Integer>> createMap(int[] arr) {
    Map<Integer, Set<Integer>> map = new TreeMap<>();

    for (int i = 0; i < arr.length; i++) {
        map.computeIfAbsent(arr[i], key -> new TreeSet<>()).add(i);
    }

    return map;
}

private static void removeElement(int pos,
                                  int num,
                                  Map<Integer, Set<Integer>> map) {
    Set<Integer> value = map.getOrDefault(num, Set.of());

    if (value.size() == 1)
        map.remove(num);
    else if (value.size() > 1)
        value.remove(pos);
}

字符串

相关问题