使用java在数组中首先复制

时间:2018-04-29 06:53:19

标签: java

我正在尝试解决一个问题,我需要找到索引较低的重复数字。

例如,如果数组是 {1,4,3,5,3,2,1} 然后答案应该是 3 ,因为它是较小的索引然后是下一个重复的整数1.

如果未找到重复的数字,则需要返回-1。 我需要编写一个以o(n)时间复杂度刺激它的程序。

我能够解决它的O(n ^ 2)概率,但不知道如何为O(n)做到这一点。如果没有找到重复的数字,我也不理解如何实现。 请帮助我。我被困在这里。

提前谢谢。

到目前为止我的代码:

import java.util.ArrayList;
import java.util.Collections;

public class firstDuplicate
{
    //defining array
    public static void main(String args[]) 
    {
     int[] a1 = new int[] {2,3,3,1,5,2};

    //int[] a1 = new int[] {2,3,4,1,5,8};

    for(int i=0;i<a1.length; i++) 
    {
        System.out.println(a1[i]);
    }
    int counter =0;
    ArrayList<Integer> list1 = new ArrayList<>();


    for(int i =0; i<a1.length; i++) 
    {
        for(int j=i+1;j<a1.length; j++) 
        {
            if(a1[i]==a1[j])
            {
                counter =counter+1;
                System.out.println(j);
                list1.add(j);

            }
            else {
                int k =-1;
                System.out.println(k);
            }
        }


    }

    System.out.println("Printing ur numbers of repetation");
    System.out.printf("%d",counter);
    System.out.println("If printed ur answer is following");
    int k = Collections.min(list1);
    System.out.println(k);
    }
}

4 个答案:

答案 0 :(得分:1)

您可以这样继续:

  • 创建一个空集,然后为输入数组中的每个元素创建
  • 检查元素是否已在Set

    • 如果是,则在此处停止算法并返回当前元素作为结果
    • 如果否,则将当前元素添加到集合中,并继续使用数组中的下一个元素。

答案 1 :(得分:0)

编辑:感谢Saka1029和Patrick Parker。

Idea保持不变 - 我们使用Set来查找第一个重复元素,而不是拆分添加和检查元素是否已经存在于Set中的两个单独的操作中(我们通常希望找到第一个重复的元素)尽可能少的步骤 - 在'if'(存在于Set中)和'e​​lse'(添加到Set)结构中,我们可以将其简化为单个'if'语句,如Saka1029指出的那样。

public static int findDuplicateWithLowestIndext(int... a){

Set<Integer> set = new HashSet<>();
for(int num : a){

// since add() returns a true if elemenet was added and false if it wasn't -
// due to being duplicate -  we can add elements and look for duplicate
// at the same time

     if(!set.add(num)){
        return num;
        }
     }
   return -1; 
 }

至于bigO,为了简单起见我会这样说:因为我们遍历整个数组和方法体中的一次,我们使用Set中的一个add()方法,它本身就是O(1) - 这就是我们最终得到O(n)的方式 - 虽然这是简化的方式。

答案 2 :(得分:0)

您可以使用流/查找组合获取所有重复值的第一个索引:

List<Integer> l = List.of(1,4,3,5,3,2,1);

l.stream()
  //Compute a map of elements -> occurrence count:
 .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
 .entrySet()
 .stream()
  //Limit stream to values occurring more than once
 .filter(it -> it.getValue() > 1)
  //Find the first index of each key
 .map(entry -> l.indexOf(entry.getKey()))
 .collect(Collectors.toList())

以上返回此列表:

[0, 2]

答案 3 :(得分:0)

O(n)解决方案如下:

  1. 创建一个大小为10的数组。
  2. 每次遇到号码时,都会检查对应的索引是否等于1。
  3. 如果是这样的话,你就有了副本。
  4. 如果不是,则递增它。
  5. <强> Demo

    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(getLowestDuplicate(1,4,3,5,3,2,1)); // 3
        System.out.println(getLowestDuplicate(2,3,3,1,5,2)); // 3
        System.out.println(getLowestDuplicate(1,4,5,3,2)); // -1
    }
    
    public static int getLowestDuplicate(int... numbers) {
        int[] counters = new int[10];
        for (int i : numbers) {
            if (counters[i] == 1) return i;
            counters[i] = counters[i] + 1;
        }
        return -1;
    }