我必须在长度为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 :(得分: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);
}
答案 1 :(得分:1)
以下是一个不起作用的原因示例:
假设已排序的数组包含以下数字:1 2 3 4 5 6 7 8 9 9
。这个数组中缺少多少个数字?只有一个。我们错过了号码0
。
他们“正确”的地方有多少人?只有最后一个9
。这就是为什么您的代码将返回9
而不是1
。
答案 2 :(得分:0)
如果我确实很好地记下了你的问题,请用你得到的数组填充set
集合,然后检查长度是否等于10。
HashSet<Integer> set = new HashSet<>(arrayOfRandomNumbers);
if (set.size() == 10) {
//all elements in array
}
答案 3 :(得分: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());
}
这将为您提供nMin(5)和nMax(50)之间的X(20)随机整数集中所有缺失的intergs;
答案 4 :(得分:0)
这是您原始任务的完整解决方案&#34;你在评论中提到过:
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;
}
}