我正在尝试创建一个代码,给定一个数字在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;元素,它列出了所有缺失的东西。有人有什么建议吗?
答案 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;
}