Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中查找最大的未重复数字_Java_Algorithm_Sorting_For Loop_Compare - Fatal编程技术网

Java 在ArrayList中查找最大的未重复数字

Java 在ArrayList中查找最大的未重复数字,java,algorithm,sorting,for-loop,compare,Java,Algorithm,Sorting,For Loop,Compare,我需要一个算法来查找在数组列表中只出现一次的最大数字 例如,假设我有一个带有元素的ArrayList [3,3,3,6,7,8,8,9,9,9] 这里,我需要的算法将产生数字7,因为它是列表中最大的未重复数字 先决条件: 输入列表不能保证排序 输入列表将始终包含至少一个非重复编号 最好的方法是在元素列表的排序数组中找到未重复的元素。因此,通过这样做,我们可以分离未重复元素的列表,然后我们可以在获得的列表中找到最大的元素 建议参考以下链接了解更多详细信息 -Bruce最好的方法是在元素列表的排

我需要一个算法来查找在
数组列表中只出现一次的最大数字

例如,假设我有一个带有元素的
ArrayList

[3,3,3,6,7,8,8,9,9,9]

这里,我需要的算法将产生数字
7
,因为它是列表中最大的未重复数字

先决条件:

  • 输入列表不能保证排序

  • 输入列表将始终包含至少一个非重复编号


    • 最好的方法是在元素列表的排序数组中找到未重复的元素。因此,通过这样做,我们可以分离未重复元素的列表,然后我们可以在获得的列表中找到最大的元素

      建议参考以下链接了解更多详细信息


      -Bruce

      最好的方法是在元素列表的排序数组中找到未重复的元素。因此,通过这样做,我们可以分离未重复元素的列表,然后我们可以在获得的列表中找到最大的元素

      建议参考以下链接了解更多详细信息


      -Bruce

      如果我们假设输入列表已排序,我们应该能够在
      O(N)
      中执行此操作,而不需要额外的空间

      public static Integer maxUnduplicatedVal(ArrayList<Integer> lst){
          if(lst == null || lst.isEmpty()) 
              return null;
          if(lst.size() == 1) return lst.get(0);
      
          if(! lst.get(lst.size() - 1).equals(lst.get(lst.size() - 2))) 
              return lst.get(lst.size() - 1);
      
          for(int i = lst.size() - 2; i > 0; i--){
              Integer next = lst.get(i + 1);
              Integer here = lst.get(i);
              Integer prev = lst.get(i - 1);
              if(! next.equals(here) && ! prev.equals(here)) return here;
          }
      
          if(! lst.get(0).equals(lst.get(1))) return lst.get(0);
          return null; //All duplicates
      }
      

      这仍然是
      O(N)
      ,需要一些额外的空间。

      如果我们假设输入列表已排序,我们应该能够在
      O(N)
      中执行此操作,而不需要额外的空间

      public static Integer maxUnduplicatedVal(ArrayList<Integer> lst){
          if(lst == null || lst.isEmpty()) 
              return null;
          if(lst.size() == 1) return lst.get(0);
      
          if(! lst.get(lst.size() - 1).equals(lst.get(lst.size() - 2))) 
              return lst.get(lst.size() - 1);
      
          for(int i = lst.size() - 2; i > 0; i--){
              Integer next = lst.get(i + 1);
              Integer here = lst.get(i);
              Integer prev = lst.get(i - 1);
              if(! next.equals(here) && ! prev.equals(here)) return here;
          }
      
          if(! lst.get(0).equals(lst.get(1))) return lst.get(0);
          return null; //All duplicates
      }
      
      这仍然是O(N)
,albiet需要一些额外的空间

1) 首先执行集合。如果列表尚未排序,则排序(列表)

2) 从最后一个开始,因为它是最大的数字,并获取其索引

3) 检查该索引处的数字是否等于索引-1处的数字,如果是,则它是最大的重复数字,否则对索引-1重复此步骤

1) 首先执行集合。如果列表尚未排序,则排序(列表)

2) 从最后一个开始,因为它是最大的数字,并获取其索引

3) 检查该索引处的数字是否等于索引-1处的数字,如果是,则它是最大的重复数字,否则请重复此步骤,因为索引-1在此处可能有用

    Integer[] myArr = {3, 3, 3, 6, 7, 8, 8, 9, 9, 9}; // sample array
    ArrayList<Integer> myList = new ArrayList<Integer>(Arrays.asList( myArr ) );

    // creating a set from an ArrayList will remove any duplicate elements
    HashSet<Integer> mySet = new HashSet<Integer>(myList);

    /* Make sure list isn't empty or null here, etc. */

    Integer largest = null;

    // iterate through the set, ensuring you don't examine duplicates
    for ( Integer i : mySet ) {

        // if the frequency of that element is 1, we can compare it
        if ( Collections.frequency(myList, i) == 1 )
        {
            if ( largest == null )
            {
                largest = i; // base case
            } else if ( i > largest ) {
                largest = i;
            }
        }
    }

    System.out.println( "The largest non-duplicate is " + largest );
    // or return, etc.
Integer[]myArr={3,3,3,6,7,8,8,9,9};//样本阵列
ArrayList myList=新的ArrayList(Arrays.asList(myArr));
//从ArrayList创建集合将删除任何重复的元素
HashSet mySet=新的HashSet(myList);
/*确保列表在这里不是空的或空的,等等*/
最大整数=空;
//遍历集合,确保不检查重复项
for(整数i:mySet){
//如果该元素的频率为1,我们可以比较它
if(Collections.frequency(myList,i)==1)
{
如果(最大==null)
{
最大=i;//基本情况
}else if(i>最大){
最大=i;
}
}
}
System.out.println(“最大非重复项为”+最大项);
//或返回等。
在这里可能有用

    Integer[] myArr = {3, 3, 3, 6, 7, 8, 8, 9, 9, 9}; // sample array
    ArrayList<Integer> myList = new ArrayList<Integer>(Arrays.asList( myArr ) );

    // creating a set from an ArrayList will remove any duplicate elements
    HashSet<Integer> mySet = new HashSet<Integer>(myList);

    /* Make sure list isn't empty or null here, etc. */

    Integer largest = null;

    // iterate through the set, ensuring you don't examine duplicates
    for ( Integer i : mySet ) {

        // if the frequency of that element is 1, we can compare it
        if ( Collections.frequency(myList, i) == 1 )
        {
            if ( largest == null )
            {
                largest = i; // base case
            } else if ( i > largest ) {
                largest = i;
            }
        }
    }

    System.out.println( "The largest non-duplicate is " + largest );
    // or return, etc.
Integer[]myArr={3,3,3,6,7,8,8,9,9};//样本阵列
ArrayList myList=新的ArrayList(Arrays.asList(myArr));
//从ArrayList创建集合将删除任何重复的元素
HashSet mySet=新的HashSet(myList);
/*确保列表在这里不是空的或空的,等等*/
最大整数=空;
//遍历集合,确保不检查重复项
for(整数i:mySet){
//如果该元素的频率为1,我们可以比较它
if(Collections.frequency(myList,i)==1)
{
如果(最大==null)
{
最大=i;//基本情况
}else if(i>最大){
最大=i;
}
}
}
System.out.println(“最大非重复项为”+最大项);
//或返回等。

输入列表是否始终排序?如果列表完全由重复的元素组成,即[1,1,1,2,2,2],那么返回应该是什么?输入列表并不总是排序的。它将始终至少包含一个未重复的数字。使用
映射
,其中键是列表元素,值是它被看到的次数。输入列表是否始终排序?如果列表完全由重复的元素组成,即[1,1,1,2,2,2],那么返回应该是什么?输入列表并不总是排序的。它将始终至少包含一个未复制的数字。使用
映射,其中键是列表元素,值是它被看到的次数。您的初始代码将打印左侧(i-1)不相同的元素,即使i+1是i的副本。基本上,如果数组中有超过1个不同的数字,它将始终打印最大数字。啊哈,捕捉得好。修复…据我所知,如果不使用O(n)额外的空间,这些问题不可能在O(n)中完成,除非他们被分类。我相信我已经修复了它,现在应该可以工作了。我觉得我已经涵盖了所有内容。1-distinct max是最后一个元素,2-distinct max是第一个元素,3-distinct元素位于中间(介于[1…大小-2]之间),4-没有distinct max。我还缺少什么?您的初始代码将打印左侧(I-1)所在的元素即使i+1是i的副本,也不相同。基本上,如果数组中有超过1个不同的数字,它将始终打印数字最大值。啊哈,捕捉得好。修复…据我所知,不使用O(n),在O(n)中无法解决此问题额外的空间,除非他们被分类。我相信我已经修复了它,现在应该可以工作了。我觉得我已经涵盖了所有内容。1-不同的最大值是最后一个元素,2-不同的最大值是第一个元素,3-不同的元素在中间(介于[1…大小-2],4-没有不同的最大值。我还缺少什么?