点击下面链接即可进行刷题学习
开始刷题
要插入数字k有三种情况:
1️⃣k在数组中
2️⃣k在数组最右边
3️⃣k在数组最左边
对第1️⃣种情况我们可以采取数组从最后一个元素开始右移的方法,每次判断k是否大于指定数,当大于时就插入。
第2️⃣种情况可以包含在第一种情况(k大于最后一个元素,直接插入)。
第3️⃣种情况就是当第一个元素被移到第二个位置时,直接就把k放在第一个元素的位置就行了。
代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int arr[51] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int k = 0;
scanf("%d", &k);
//数组后移途中插入k
for(i = n; i > 0; i--)
{
if(arr[i - 1] > k)
{
arr[i] = arr[i - 1];
}
else
{
arr[i] = k;
break;
}
}
//当k小于所有数字时
if(i == 0)
{
arr[0] = k;
}
for(i = 0; i < n + 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
直接用最后一个元素减第一个元素,有三种情况:
1️⃣大于0,遍历数组,俩俩比较,都<,则sorted,否则unsorted。
2️⃣小于0,遍历数组,俩俩比较,都>,则sorted,否则unsorted。
3️⃣等于0,遍历数组,俩俩比较,都=,则sorted,否则unsorted。
代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[50] = { 0 };
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int tmp = arr[n - 1] - arr[0];
int jud = 0;
if (0 == tmp)
{
for (i = 0; i < n - 1; i++)
{
if (arr[i] != arr[i + 1])
{
jud = -1;
break;
}
}
}
else if (tmp > 0)
{
for (i = 0; i < n - 1; i++)
{
if (arr[i] > arr[i + 1])
{
jud = -1;
break;
}
}
}
else
for (i = 0; i < n - 1; i++)
{
if (arr[i] < arr[i + 1])
{
jud = -1;
break;
}
}
if (jud == 0)
{
printf("sorted\n");
}
else
{
printf("unsorted\n");
}
return 0;
}
创造两个标志位flag1和flag2, flag1表示升序, flag2表示降序, 最后
flag1 + flag2 == 1, 则有序。
代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//升序标志
int flag1 = 0;
//降序标志
int flag2 = 0;
for(i = 0; i < n - 1; i++)
{
if(arr[i] < arr[i + 1])
{
flag1 = 1;
}
else
{
flag2 = 1;
}
}
if(flag1 + flag2 == 1)
{
printf("sorted\n");
}
else
{
printf("unsorted\n");
}
return 0;
}
遍历数组,找到要删除数字del对应的位置,把后边的元素都往前移。这里要注意每次移动完后数组长度都要减1,找到的元素的下标也要减1(如果俩个要删除的数字挨在一起,就会跳过第二个)
代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int del = 0;
scanf("%d", &del);
for(i = 0; i < n; i++)
{
//找到指定元素
if(arr[i] == del)
{
int j = 0;
for(j = i; j < n - 1; j++)
{
arr[j] = arr[j + 1];
}
n--;
i--;
}
}
for(i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
用图来表示:
如果i指向的不是要删除的就arr[ j ] = arr[ i ], i , j都后移
如图:
当i指向的是要删除的元素时,j 不动, i 跳到不是要删除的元素的位置
如图
此时得注意元素个数变成了 j 。
代码如下:(上部分都一样的,不浪费篇幅)
int j = 0;
for(i = 0; i < n; i++)
{
if(arr[i] != del)
{
arr[j++] = arr[i];
}
}
//此时元素个数为 j 个
for(i = 0; i < j; i++)
{
printf("%d ", arr[i]);
}
思路:
1️⃣去重第一个元素:从第二个元素开始遍历数组,找到相同的元素,向左移动数组,没有则不移。
2️⃣去重第二个元素:从第三个元素开始遍历数组,找到相同的元素,向左移动数组,没有则不移。
…………
代码如下:
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int arr[1000];
for(i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int j = 0;
for(i = 0; i < n; i++)
{
for(j = i + 1; j < n; j++)
{
if(arr[j] == arr[i])
{
//移动
int k = 0;
for(k = j; k < n - 1; k++)
{
arr[k] = arr[k + 1];
}
n--;
j--;
}
}
}
for(i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
思路:不用移动数组,类似上题的跳过法,跟已经输出的元素比较,发现有相同的元素直接跳过不输出就行了。
代码如下:
for(i = 0; i < n; i++)
{
int flag = 1;
int j = 0;
//输出前和前面的元素比较
for(j = 0; j < i; j++)
{
if(arr[i] == arr[j])
{
flag = 0;
}
}
if(flag)
{
printf("%d ", arr[i]);
}
}
只要发现有和前面相同的,flag就会改为0,条件为假就不会输出。
这道题是让我们把俩个数组一起排好序输出,我们可以直接把他们放在一个数组里直接简单粗暴排序并输出。
代码如下:
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int i = 0;
int arr[2000] = {0};
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = n; i < m + n; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr, m + n, 4, cmp_int);
for (i = 0; i < m + n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这里用到库函数qsort函数,不明白的同学请看我的另一篇博客中的争夺前五名的题目
俩个数组从头开始比较,每次都输出较小的,输出完后往后移动一位。直到一个数组输出完后,直接按顺序输出另一个数组的剩余所有数。
如图:
代码如下:
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr1[1000] = {0};
int arr2[1000] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for(i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//俩"箭头"
i = 0;
int j = 0;
while(i < n && j < m)
{
if(arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
//输出剩余元素
if(i < n)
{
for(; i < n; i++)
{
printf("%d ", arr1[i]);
}
}
else
{
for (; j < m; j++)
{
printf("%d ", arr2[j]);
}
}
return 0;
}
要注意的问题:
要把2 ~ n的数字放到数组里,数组的大小要 [ n + 1 ] (n个元素)。
代码如下:
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
//n 个元素要n + 1 的数组
int arr[n + 1];
int i = 0;
//初始化
for(i = 0; i <= n; i++)
{
arr[i] = i;
}
//从2开始
for(i = 2; i <= n; i++)
{
int j = 0;
for(j = i + 1; j <= n; j++)
{
if(arr[j] % i == 0)
{
arr[j] = 0;
}
}
}
int count = 0;
for(i = 2; i <= n; i++)
{
if(arr[i])
{
printf("%d ", arr[i]);
}
else
{
count++;
}
}
printf("\n%d\n", count);
}
return 0;
}
首先找到规律:
\ :右斜线横行和纵列数相等
/ :左斜线横行和纵列数相加值一样
要注意的:
不要忘了其他地方打印空格。
代码如下:
int main()
{
int n = 0;
while(~scanf("%d", &n))
{
int i = 0;
int j = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(i == j || i + j == n - 1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
点击链接[一起刷题吧]