查找数组中缺少的数字

时间:2016-12-26 21:31:37

标签: c++ arrays

我正在尝试创建一个代码,给定一个数字在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

但相反,在我得到第一个&#34;缺失&#34;元素,它列出了所有缺失的东西。有人有什么建议吗?

6 个答案:

答案 0 :(得分:1)

您的代码会导致未定义的行为,因为public static void showInfoDialog(Context context, final ImageView iv, final int title, final int text){ iv.setImageResource(R.drawable.ic_info_touched); // AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setCancelable(true); builder.setTitle(title); builder.setMessage(text); builder.setPositiveButton(R.string.gotIt, null); builder.show(); // Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { iv.setImageResource(R.drawable.ic_info_primary); } }, 25); } 对于missingArray[i]大于i的值无效。

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

5

答案 1 :(得分:1)

真正出错的是,一旦检测到缺失值,您的初始假设 - 预期在位置i处的值(i + 1)将变为无效。如果要检测所有缺失值,则需要将数组索引与值跟踪分离。请考虑以下代码:

public static void main(String[] args) {
    //What color is chocolate? 1. White 2. Black 3. Brown

    int corAns = methodChocolate(3);
    if (corAns == 3) {
        System.out.println("Brown");
    }

    System.out.println("What color is chocolate? 1. White 2. Black 3. Brown.
                       The answer is "+corAns);
}

static int methodChocolate(int ans) {
    if (ans == 3) {
        return 3;
    } else if (ans == 2) {
        return 2;
    } else if (ans == 1) {
        return 1;
    }
    return 0;
}

请注意,我只使用'else'而不是两次执行基本相同的测试。如果有人试图教你去做其他事情,请随时告诉他们我作为一名专业程序员的观点是,这个主题让我觉得应该避免学术迂腐

答案 2 :(得分: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";
    }
}

答案 3 :(得分: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

答案 4 :(得分: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++;
     }
   }
 }

在此示例中,缺少第二个。您无需事先知道此解决方案缺少哪些数字。我使用一个变量来跟踪丢失的数字并更改数组的索引。

答案 5 :(得分:-1)

    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;

}