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-没有不同的最大值。我还缺少什么?