1.1、 求两个有序数组的公共元素
#include <stdio.h>
int main() {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int b[] = { 2, 4, 6, 8, 10 };
int i = 0, j = 0;
while (i < sizeof(a) / 4 && j < sizeof(b) / 4) {
if (a[i] < b[j]) {
i++;
}
else if (a[i] == b[j]) {
printf("%d ", a[i]);
i++;
j++;
}
else {
j++;
}
}
return 0;
}
1.2 、求三个有序数组的公共元素
#include <stdio.h>
int main() {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int b[] = { 2, 4, 6, 8, 10 };
int c[] = { 2, 4 };
int i = 0, j = 0, k = 0;
//for (i = 0; i < sizeof(a) / 4; i++) {
// for (j = 0; j < sizeof(b) / 4; j++) {
// for (k = 0; k < sizeof(c) / 4; k++) {
// if (a[i] == b[j] && a[i] == c[k])
// printf("%d ", a[i]);
// }
// }
//}
while (i < sizeof(a) / 4 && j < sizeof(b) / 4 && k < sizeof(c) / 4) {
if (a[i] < b[j] && a[i] < c[k]) {
i++;
}
if (b[j] < a[i] && b[j] < c[k]) {
j++;
}
if (c[k] < b[j] && c[k] < a[i]) {
k++;
}
else if (a[i] == b[j] && a[i] == c[k]) {
printf("%d ", a[i]);
i++;
j++;
k++;
}
}
return 0;
}
1.3、求n个有序数组的公共元素
2、求数组的最大值和次大值
#include <stdio.h>
#define NUM 5
int main() {
int i = 0;
int j = 0;
int temp = 0;
int max = 0;
int next_max;
int a[NUM] = { 2,9,3,4,6 };
for (int i = 0; i < NUM - 1; i++) {
for (int j = 0; j < NUM - 1 - i; j++) {
if (a[j] < a[j + 1]) {
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
}
max = a[0];
next_max = a[1];
printf("%d %d", max, next_max);
return 0;
}
3、 给定一个n个整型元素的数组a,其中有一个元素出现次数超过n / 2,求这个元素。
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,2,2 };
int tmp = arr[0];
int cnt = 1;//tmp出现的次数-非tmp出现的次数
for (int i = 1; i < sizeof(arr) / sizeof(int); ++i)
{
if (tmp == arr[i])
{
++cnt;
}
else
{
--cnt;
if (cnt <= 0)
{
tmp = arr[i];
cnt = 1;
}
}
}
printf("cnt = %d\n", cnt);
}
#include <stdio.h>
#define N 10
int find_1(int* a, int n) {
int curValue = a[0];
int count = 1;
for (int i = 1; i < n; ++i) {
if (a[i] == curValue)
count++;
else {
count--;
if (count < 0) {
curValue = a[i];
count = 1;
}
}
}
return curValue;
}
int find_2(int* a, int n) {
int temp = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] < a[j + 1]) {
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
}
return a[n / 2];
}
int main() {
int a[N] = { 3,9,9,9,9,9,2,3,9,2 };
int i = 0;
//int ret = find_1(a, N);
int ret = find_2(a, N);
printf("%d\n", ret);
system("pause");
return 0;
}
4、给定一个含有n个元素的整型数组,找出数组中的两个元素x和y使得abs(x - y)值最小
/qsort()函数原型
//void qsort(void* base,size_t nmemb,size_t size,int (*compare)(const void*, const void*));
#include <stdio.h>
#include <stdlib.h> //qsort()头文件
#include <limits.h> //INT_MAX头文件
#define N 5
int compare(const void* a, const void* b) { //先将变量a和b强制类型转换为int型指针,然后引用其中的值进行减法运算再将结果返回
return *(int*)a - *(int*)b;
}//对元素进行升序排列,则定义comp所指向的函数为:如果其第一个参数比第二个参数小,则返回一个小于0的值,反之则返回一个大于0的值,如果相等,则返回0。
int find_abs_min(int* a, int n) {
int i, j, k, min_value;
qsort(a, n, sizeof(int), compare);
min_value = INT_MAX;
j = k = 0;
for (i = 0; i < n - 1; i++) {
if (a[i + 1] - a[i] < min_value)
{
min_value = a[i + 1] - a[i];
j = a[i + 1];
k = a[i];
}
}
printf("min_value: %d, %d - %d\n", min_value, j, k);
return 0;
}
int main() {
int array[N] = { 2,5,6,16,23 };
find_abs_min(array, N);
return 0;
}
5、 给定含有1001个元素的数组,其中存放了1-1000之内的整数,只有一个整数是重复的,请找出这个数
提示:A1 + … + A1001 – (1 + …+ 1000)