由于两个数组,一比较就会出现两次for循环,所以我能想到的就是组合求出现次数,这样子,就不会出现两次for循环,上代码,希望有看到的提出更好的方法
1 #include <iostream> 2 using namespace std; 3 4 void printarray(int *arr, int size) 5 { 6 if (arr == nullptr) 7 { 8 return; 9 } 10 cout << endl; 11 for (int i = 0; i < size; i++) 12 { 13 cout << arr[i] << " "; 14 } 15 cout << endl; 16 } 17 18 int main() 19 { 20 int a[] = {1, 2, 3, 4, 5}; 21 int b[] = {1, 4, 5, 6, 9, 8}; 22 int i = 0, j = 0; 23 24 int counta = sizeof(a)/sizeof(int); //a数组长度 25 int countb = sizeof(b) / sizeof(int); //b数组长度 26 27 cout << "a数组元素:"; 28 printarray(a, counta); 29 30 cout << "b数组元素:"; 31 printarray(b, countb); 32 33 int *c = new int[counta + countb]; //用于存储a、b组合后的数组 34 35 //将a数组存入c数组中 36 for (i = 0; i < counta; i++) 37 { 38 c[i] = a[i]; 39 } 40 //将b数组存入c数组中,紧接着a数组里的元素 41 for (i = counta, j = 0; i < counta + countb/*j < countb*/; i++,j++) 42 { 43 c[i] = b[j]; 44 } 45 46 //求出两个数组中最大的那个值 47 int maxnum = c[0]; 48 for (i = 0; i < counta + countb; i++) 49 { 50 if (maxnum < c[i]) 51 { 52 maxnum = c[i]; 53 } 54 } 55 56 //将数组里的元素值作为d数组的下标,这样,出现这个数字一次, 57 // d数组相应下标的元素值就加一,最后判断d数组里面元素的值, 58 // 就知道a、b数组里面每个数字出现的次数 59 // 所以一定需要求出最大的哪个元素,用来确定d数组的长度 60 61 int *d = new int[maxnum + 1]; 62 memset(d, 0, sizeof(int)*(maxnum + 1)); //将d数组全部初始化为0 63 64 cout << "组合后的数组是:"; 65 printarray(c, counta + countb); 66 67 cout << "相同的数字:"; 68 for (i = 0, j = 0; i < counta + countb; i++) 69 { 70 if (d[c[i]] >= 1)//如果d[c[i]]的值大于等于1,那么说明这个下标的值在组合数组c里面已经出现过1次以上 71 { 72 d[c[i]]++; 73 cout << c[i] <<" "; 74 } 75 else 76 { 77 d[c[i]]++; 78 } 79 } 80 81 cout << "\na数组和b数组不相同的数字是:"; 82 for (i = 0; i <= maxnum; i++) 83 { 84 if (d[i] == 1) 85 { 86 cout << i << " "; 87 } 88 } 89 cout << endl; 90 91 return 0; 92 }
运行结果: