问题1 给定一个数组,将数组忠某个元素向右移动K个位置,k为非负数。
思路 : 首先创建一个数组,并打印;然后进行数组元素的交换,从被指定的移动的第n个元素开始一次向后进行元素交换,交换次数为元素移动的位数。
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 7
void Move_Arr(int A[], int num, int k) { // 数组被隐式转化成指针
int temp = 0;
int i, j;
for (i = num; i <= k; i++) {
// 交换数组元素
temp = A[i-1];
A[i-1] = A[i];
A [i] = temp;
}
return; // 无返回值, 这个 return 表示该函数结束。
}
int main() {
int num = 0;
int k = 0;
int A[N] = { 10,20,45,20,5,5,4 };
// 打印数组
for (int i = 0; i < N; i++) {
printf("%d ", A[i]);
}
printf("\n");
printf("请输入要移动的第几个元素 num 和移动的位数 k :");
scanf("%d%d", &num,&k);
printf("\n将第 num 个元素移动 k 位的结果为:\n");
Move_Arr(A, num, k); // 调用移动函数
// 打印移动后的数组
for (int i = 0; i < N; i++) {
printf("%d ", A[i]);
}
printf("\n");
system("pause");
return 0;
}
运行结果如下:
10 20 45 20 5 5 4
请输入要移动的第几个元素 num 和移动的位数 k :1 3
将第 num 个元素移动 k 位的结果为:
20 45 20 10 5 5 4
请按任意键继续. . .
问题 2: 给定一个数组 nums 和一个值 val ,需要原地移除所有数值等于 val 的元素,返回移除后数组。
思路: 对数组进行遍历,直到遇到要删除的数组元素;每删除一个元素该元素后面的所有元素要向前挪动一位;再寻找下一个要删除的元素,再将每个元素向前移动一位。
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
# define N 10
int main() {
int i, j, k= 0;
int m = 0;
// 创建数组
int A[N] = { 0,5,5,8,5,5,4,5,7,10 };
printf("删除前的数组元素为:\n");
for (i = 0; i < N; i++) {
printf("%d ", A[i]);
}
// 指定元素
printf("\n请输入要删除的元素:");
scanf("%d", &m);
// 删除
for (i = 0; i < N; i++) {
if (A[i] == m) {
for (j = i; j < N; j++) {
A[j] = A[j + 1]; // 删除一个,每个元素先前挪动一位。
}
k++;
i = 0; // 重新遍历一次,以防重复。如; 1,5,5,5,5
}
}
printf("删除后的数组有效元素个数为:%d:\n", (N - k));
for (i = 0; i < (N - k); i++) {
printf("%d ", A[i]);
}
system("pause");
return 0;
}
运行结果为:
删除前的数组元素为:
0 5 5 8 5 5 4 5 7 10
请输入要删除的元素:5
删除后的数组有效元素个数为:5:
0 8 4 7 10
请按任意键继续. . .