2016-09-30 61 views
2

我必须在长度= 10的数组中找到丢失的整数(在0-9的范围内随机生成)。我有想法对数组进行排序,然后检查每个数组如果它等于数组中的位置。我想出了下面的代码:在排序数组中寻找丢失的整数

public void nichtGetroffen(){ 
    s.quickSort(enten, 0, enten.length -1); 
    sum = 0; 
    for (int i=0; i < enten.length; i++){ 
     if(enten[i] != i){ 
      System.out.print(i + ""); 
      sum = sum +1; 
     } 
    } 

的问题是,它的工作原理有时,有时不和我遗憾的是没有一个想法如何解决这个问题。 (enten是数组的名称)

+0

请说明。你在[Nmin,NMax]的范围内有一组X的integesr,你想在组中找到“间隙”,是吗? – Antoniossss

+0

原始任务是:创建一个长度为10的数组,填充范围为0到9之间的随机整数。然后给出缺失的整数(因为某些整数可以是doupletts)重复此功能n次。然后计算失去整数的平均数(这就是为什么我加1以总和每个缺失的整数,所以我可以通过n分到底)。我希望这可以清除事情。 –

+0

你说有多少失踪整数*复数*。你的意思是有多个整数缺失? –

回答

1

如果对数组进行排序,如果下一个元素比当前元素大1以上,则表示缺少数字。然后,只需在数组的开头和末尾查找缺少的数字。

s.quickSort(enten, 0, enten.length -1); 

// Print missing numbers less than the smallest element. 
for (int j = 0; j < enten[0]; ++j) { 
    System.out.println(j); 
} 

// Print missing numbers between elements. 
for (int i = 1; i < enten.length; ++i) { 
    // If enten[i - 1] + 1 >= enten[i], this loop body never runs. 
    for (int j = enten[i - 1] + 1; j < enten[i]; ++j) { 
    System.out.println(j); 
    } 
} 

// Print missing numbers greater than the largest element. 
for (int j = enten[enten.length-1] + 1; j <= 9; ++j) { 
    System.out.println(j); 
} 
+0

好吧,这解决了它。非常感谢你。你可能会解释每一步更多我必须在星期二提出这一点,如果我不完全知道每一步我会有一些问题。 –

+0

@Dämonplay你为什么不用调试器或纸上书写?我不想呆滞,但我也不想摧毁你的学习机会。 –

+0

好的一点。你说得对,这是一个学习经验。我有时会忘记这一点。但是明天我会做这个,毕竟睡眠很重要。谢谢你提醒我。 –

0

如果我做了很好understend你的问题,填补了set收集与你得到了数组,然后,检查lenght是等于10。做到这一点所以用

HashSet<Integer> set = new HashSet<>(arrayOfRandomNumbers); 
if (set.size() == 10) { 
    //all elements in array 
} 
0

的一种方式Set其仅具有独特的元素的性质:

public static void main(String[] args) { 
    // randomizing 
    int nMin = 5; 
    int nMax = 50; 
    int x = 20; 
    Random r = new Random(); 
    Integer[] arr = new Integer[x]; 
    for (int i = 0; i < x; i++) { 
     int val = nMin + r.nextInt(nMax - nMin); 
     System.out.println(val); 
     arr[i] = val; 
    } 

    // detection 

    Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr)); 
    List<Integer> missing = new ArrayList<>(); 
    for (int i = nMin; i < nMax; i++) { 
     if (!set.contains(i)) { 
      missing.add(i); 
     } 
    } 

    System.out.println("Missing elements count " + missing.size()); 
    System.out.println("Missing elements: " + missing.toString()); 
} 

这会给你从集合X(20)无机氮之间的随机整数的所有缺少interegs (5)和nMax(50)包括在内;

+0

我从来没有听说过集,所以我知道我现在要看什么。 –

0

这里是你的“原始任务”一个完整的解决方案,你已经在评论中提到:

public class Gaps { 
    public static void main(String[] args) { 
     int runs = 100; 
     int nMin = 0; 
     int nMax = 10; 
     int x = 10; 

     double missingSum = 0; 

     for (int run = 0; run < runs; run++) { 
      Integer[] arr = randomize(nMin, nMax, x); 
      List<Integer> missing = getMissingElements(nMin, nMax, arr); 
      missingSum += missing.size(); 
     } 
     double avg = missingSum/runs; 
     System.out.println("Missing elements avarage count: " + avg); 

    } 

    private static List<Integer> getMissingElements(int nMin, int nMax, Integer[] arr) { 
     Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr)); 
     List<Integer> missing = new ArrayList<>(); 
     for (int i = nMin; i < nMax; i++) { 
      if (!set.contains(i)) { 
       missing.add(i); 
      } 
     } 
     return missing; 
    } 

    private static Integer[] randomize(int nMin, int nMax, int x) { 
     Random r = new Random(); 
     Integer[] arr = new Integer[x]; 
     for (int i = 0; i < x; i++) { 
      int val = nMin + r.nextInt(nMax - nMin); 
      arr[i] = val; 
     } 
     return arr; 
    } 

} 
+0

感谢您的努力!幸运的是,我准备好了剩下的程序。而且比这个版本稍微短一些。 –

1

这就是为什么它不工作的例子:

都说排序数组包含以下数字:1 2 3 4 5 6 7 8 9 9。这个数组中缺少多少个数字?只有一个。我们错过了0

有多少号码在他们的“正确”的地方?只有最后的9。这就是为什么你的代码将返回9而不是1