对于这个问题,我编写了一个代码,在数组中找到重复项并将其打印出来。最初,我使用了时间复杂度为0(n ^ 2)的嵌套循环。为了更有效的0(n)解决方案,我编写了下面的代码,并希望得到一些帮助/见解如何找出是否有任何元素及其.Next()保持相同的值“Duplicates”,如果是这样,打印它们进行。
public class FindDuplicates {
public static void main(String arg[]){
int[] str={1 , 2 , 3 ,4 ,5 ,3 ,5 , 4,3,43,1,33,4,5};
List<Integer> list = new LinkedList<Integer>();
for(int x : str) {
list.add(x);
}
Collections.sort(list);
System.out.println(list);
Iterator<Integer> it = list.listIterator();
while(it.hasNext() && it.next() != null) {
/* Pseudocode => if(it.next().equals(it.next.next)); */
/* OR Pseudocode => if(it.next() == it.next().next) */
System.out.println(it) ;
}
}
}
答案 0 :(得分:5)
您需要将先前的值保留在变量中,应该类似于:
Iterator<Integer> it = list.listIterator();
if (it.hasNext()) {
Integer previous = it.next();
while(it.hasNext()) {
Integer current = it.next();
if (previous.equals(current)) {
System.out.println("Dupe: " + current);
}
previous = current;
}
}
请注意,此处并不需要链接列表(正如其他人已经指出的那样),您可以进行排序,然后使用单个循环扫描数组:
int[] str={1 , 2 , 3 ,4 ,5 ,3 ,5 , 4,3,43,1,33,4,5};
Arrays.sort(str);
for (int i = 1; i < str.length; i++) {
if (str[i] == str[i - 1]) {
System.out.println("Dupe: " + str[i];
}
}
如果您不想更改str,只需跟踪HashSet中的元素:
int[] str={1 , 2 , 3 ,4 ,5 ,3 ,5 , 4,3,43,1,33,4,5};
HashSet<Integer> seen = new HashSet<Integer>();
for (int i: str) {
if (seen.contains(i)) {
System.out.println("Dupe: " + i);
} else {
seen.add(i);
}
}
如果考虑哈希表操作O(1),这也会给出线性时间而不是O(n log n)
答案 1 :(得分:2)
首先,请注意您使用的Collections.sort高于O(n)复杂度。
关于您的问题:在O(n)复杂度的排序列表中查找重复项:
您可以将一个变量设置为您遇到的上一个值,在循环中使用该变量,只需将当前值与该变量进行比较,然后将变量设置为当前值。
答案 2 :(得分:1)
更好的方法是做到这一点。除非O(N)
具有约束,否则使用Collections.sort代替space complexity
以上 if(set.contains(it)){// Check if it.info is in map or not
System.out.println(it.info); // If it was then it is duplicate element hence print it
}
else{
set.put(it);// Else if this is the first time you saw this element put it in set.
}
复杂度。{一个基本的伪代码就像是。
O(N)
此代码的时间复杂度为{{1}}。
答案 3 :(得分:0)
int[] str={1 , 2 , 3 ,4 ,5 ,3 ,5 , 4,3,43,1,33,4,5};
您不需要使用LinkedList
来排序查找重复项。使用Arrays.sort(int[])
对数组进行排序然后扫描:以下程序将打印具有重复项的整数以及重复项计数:
int a[] = {1, 1, 1, 5, 5, 4, 4, 3, 3};
Arrays.sort(a);
for(int i=1 ; i<a.length;)
{
if(a[i] == a[i-1])
{
int j = i;
for(; j<a.length; j++)
if(a[j]!=a[i])break;
if(j > i)
System.out.println("Found duplicate: "+a[i]+" counted: "+(j - i+1));
i = j;
}
else i++;
}
示例输出:
Found duplicate: 1 counted: 3
Found duplicate: 3 counted: 2
Found duplicate: 4 counted: 2
Found duplicate: 5 counted: 2
答案 4 :(得分:0)
所有带有数组的表单,带有列表,带有链表。
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void withArray() {
int[] str = { 1, 2, 3, 4, 5, 3, 5, 4, 3, 43, 1, 33, 4, 5 };
Arrays.sort(str);
int previous = str[0];
for (int i = 1; i < str.length; ++i) {
if (str[i] == previous) {
System.out.println("Duplicate " + previous + " and " + str[i]);
}
previous = str[i];
}
System.out.println();
}
public static void withList() {
List<Integer> str = Arrays.asList(1, 2, 3, 4, 5, 3, 5, 4, 3, 43, 1, 33,
4, 5);
Collections.sort(str);
int previous = str.get(0);
for (int i = 1; i < str.size(); ++i) {
if (str.get(i) == previous) {
System.out.println("Duplicate " + previous + " and "
+ str.get(i));
}
previous = str.get(i);
}
System.out.println();
}
public static void withLinkedList() {
LinkedList<Integer> str = new LinkedList<Integer>(Arrays.asList(1, 2,
3, 4, 5, 3, 5, 4, 3, 43, 1, 33, 4, 5));
Collections.sort(str);
Iterator<Integer> it = str.iterator();
int previous = it.next();
int cur;
while (it.hasNext()) {
cur = it.next();
if (cur == previous) {
System.out.println("Duplicate " + previous + " and " + cur);
}
previous = cur;
}
System.out.println();
}
public static void main(String arg[]) {
withArray();
withList();
withLinkedList();
}
}