2016-12-26 114 views
0

我想创建一个代码,其中给定的数字在1到10之间的有序数组,代码返回所有缺少的值。查找数组中缺失的数字

我的代码如下:

int missingArray [] = {1, 3, 4, 5, 7, 8}; 

for (int i = 0; i < 11; i++) { 
    if (missingArray[i] == i+1) { 
     cout << "Continue. \n"; 
    } 
    if (missingArray[i] != i+1) { 
     cout << "The value of " << i+1 << " is missing. \n"; 
    } 
} 

我想要的代码返回 继续 2的值丢失 继续 继续 继续 6的值丢失 继续 继续 9的值缺失 缺少值10

但是相反,在我得到第一个“缺失”元素后,它列出了所有缺失的内容。任何人有任何建议?

+1

您可能还想查看[Find missing number](http://stackoverflow.com/questions/3492302/easy-interview-question-got-harder-given-numbers-1-100-find-the-missing -numbe)线程在Stackoverflow – WhiZTiM

+0

在调试器中逐步执行程序。当我是2时,你会注意到一些事情。 –

回答

1

什么是真正出问题的是,您的初始假设 - 值(i + 1)预计在位置i - 一旦检测到缺失值就会失效。如果您打算检测所有缺少的值,则需要将数组索引与值跟踪解耦。请看下面的代码:

#define NMISSWING 6 
int missingArray[NMISSING] = {1, 3, 4, 5, 7, 8}; 

int i = 0; 
for (int n=1; n<=10; n++) { 
    if (i >= NMISSING) break; // all array entries checked 

    if (missingArray[i] == n) { 
     cout << "Continue. \n"; 
     i += 1; // Matched i'th, move on to next 
    } 
    else { 
     cout << "The value of " << n << " is missing. \n"; 
    } 
} 

注意,我只是用“其他”,而不是执行两次基本相同的测试。如果有人试图教你做别的事情,随时告诉他们我作为一名专业程序员的意见是,这种主题让我觉得应该避免的学术行为

+0

工作!干杯 – lottie3

1

由于missingArray[i]对于i的值大于5,因此您的代码导致未定义的行为。

您需要稍微改变一下方法。

int missingArray [] = {1, 3, 4, 5, 7, 8}; 

int* start = missingArray; 
int* end = start + sizeof(missingArray)/sizeof(*missingArray); 

for (int i = 1; i < 11; i++) 
{ 
    if (std::find(start, end, i) == end) 
    { 
     cout << i << " is missing.\n"; 
    } 

    // Optionally 
    else 
    { 
     cout << "Found " << i << "\n"; 
    } 
} 
+0

为什么它是无效的? – lottie3

+0

为什么要这样? – LogicStuff

-2
int main() 
{ 
    char array[10] = {1,2,3,4,5,6,7,7,9,10}; 
    char i; 
    char i_2 = 1; 
    char not_ok = 1; 
    while(i_2 < 11){ 
     i = 0; 
     while(i < 10){ 
      if(array[i] == i_2){ 
       not_ok = 0; 
      } 
      i++; 
     } 
     if(not_ok){ 
      printf("Missing %d\n",i_2); 
     } 
     not_ok = 1; 
     i_2++; 
    } 
    return 0; 

} 
0

你检查missingArray [I] == i + 1的

1 == 1

3 == 2

4 == 3

5 == 4

...

所以在第一个条件1 == 1之后别人永远不会相等。

int missingArray[] = { 1, 3, 4, 5, 7, 8 }; 
int k = 0; 

for (int i = 0; i < 10; i++) { 

    if (missingArray[k] == i + 1) { 
     cout << "Continue. \n"; 
     k++; 
    } 
    else if (missingArray[k] != i + 1) { 
     cout << "The value of " << i + 1 << " is missing. \n"; 
    } 
} 
0

我的做法是选择每个元素然后迭代之间一个大于该值和数组中的下一个元素。

然后完成您正在寻找的最终值和最大值之间的迭代(在这种情况下为11)。

int missingArray [] = {1, 3, 4, 5, 7, 8}; 

    int j = 0; 

    for(auto i = 0U; i < sizeof(missingArray)/sizeof(int) - 1; ++i) 
     for(j = missingArray[i] + 1; j < missingArray[i + 1]; ++j) 
      std::cout << "missing: " << j << '\n'; 

    for(++j; j < 11; ++j) 
     std::cout << "missing: " << j << '\n'; 

输出:

missing: 2 
missing: 6 
missing: 9 
missing: 10 
0

正如PMAR说,你最初的假设是无效的。我稍微改变一下代码。我希望这能帮到您。

#include<stdio.h> 
#include <iostream> 
using namespace std; 

int main(){ 
int missingArray [] = {1, 3, 4, 5, 7, 8}; 
int numbers_mising = 0; 

for (int i = 0; i < 10; i++) { 
    if (missingArray[i - numbers_mising] == i+1) { 
     cout << "Continue. \n"; 
    } 
    if (missingArray[i - numbers_mising] != i+1) { 
     cout << "The value of " << i+1 << " is missing. \n" << numbers_mising << "\n"; 
     numbers_mising++; 
    } 
    } 
} 

在这个例子中,第二个数字也丢失了。您不需要事先知道该解决方案缺少的数字。我使用一个变量来跟踪数字缺失和更改数组的索引。