c语言,请编写函数fun,该函数功能是,删除一堆数组中所有相同的数,使之只剩下一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数
时间: 2024-02-21 10:59:15 浏览: 56
下面是一个实现该功能的 C 语言函数 `fun` 的示例代码:
```c
int fun(int a[], int n) {
int i, j;
// 将相同的数依次放到数组末尾,并记录新的数组长度
for (i = 0, j = 1; j < n; j++) {
if (a[i] != a[j]) {
a[++i] = a[j];
}
}
// 返回新的数组长度
return i + 1;
}
```
在上面的代码中,使用了双指针法来处理相同的数。首先将第一个数作为起点,然后将第二个数依次与起点比较,如果不相同,则将其放到起点之后的位置。然后将起点后移一位,继续比较下一个数。最后返回新的数组长度即可。
需要注意的是,这里假设输入的数组已经按照从小到大的顺序排列。如果没有排列好,需要先将数组排序后再调用该函数。
相关问题
用c语言编写函数fun,函数的功能是:删去一组数组中所有相同的数,使之只剩一个。数组中的数已按从小到大的顺序排列,函数返回删除后数组的个数
### 回答1:
好的,这个问题可以回答。以下是C语言函数fun的代码实现:
```c
int fun(int arr[], int n) {
int i, j;
if (n == 0) {
return 0;
}
j = 0;
for (i = 1; i < n; i++) {
if (arr[i] != arr[j]) {
arr[++j] = arr[i];
}
}
return j + 1;
}
```
该函数通过遍历数组,判断当前元素与前一个元素是否相同,如果不同就将其保留下来,否则就跳过。最后返回保留下来的元素个数(也就是删除后的数组个数)。
### 回答2:
函数fun的实现如下所示:
```c
int fun(int arr[], int n)
{
if (n <= 1) {
return n;
}
int i, j;
j = 0; // 新数组的下标
for (i = 1; i < n; i++) {
if (arr[i] != arr[j]) {
arr[++j] = arr[i]; // 将不相同的数存入新数组
}
}
return j + 1; // 返回新数组的长度
}
```
函数接受一个已按从小到大顺序排列的整数数组arr,以及数组的长度n。函数的目标是将数组中所有重复的数删除,只保留一个,并返回删除后数组的长度。
函数中使用了两个指针:i用于遍历原数组arr,j用于记录新数组的下标。初始时,j指向新数组的第一个位置。
从原数组的第二个数开始遍历,如果当前数与上一个数不相同,则说明是新的数,将它存入新数组,并将j加1,指向新数组的下一个位置。
遍历完整个数组后,新数组中只保留了一个相同的数,并且后面的重复数都被删除了。
最后,函数返回新数组的长度j+1作为结果。
### 回答3:
```c
#include <stdio.h>
int fun(int arr[], int n) {
if(n<=1) return n; // 如果数组长度小于等于1,直接返回原数组长度
int i, j; // 双指针法处理数组
for(i=0, j=1; j<n; j++) {
if(arr[i] != arr[j]) {
arr[++i] = arr[j];
}
}
return i+1; // 返回删除重复元素后的数组长度
}
int main() {
int arr[] = {1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7};
int n = sizeof(arr)/sizeof(arr[0]);
printf("删除重复元素后的数组长度为:%d\n", fun(arr, n));
return 0;
}
```
运行结果:
删除重复元素后的数组长度为:7
解释:
给定数组为{1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7},使用双指针法处理:
- 初始时,i指向第一个元素,j指向第二个元素。
- 如果arr[i]和arr[j]相等,j后移。
- 如果arr[i]和arr[j]不相等,说明找到了一个新的不同元素,将arr[j]复制到arr[i+1],然后i和j都后移。
- 继续重复上述步骤,直到j超出数组范围。
最后得到的数组为{1, 2, 3, 4, 5, 6, 7},同时返回结果7。
用C语言编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
```c
int fun(int a[], int n)
{
int i, j, k;
k = 1; // 初始化,第一个数一定不会被删除
for (i = 1; i < n; i++) { // 从第二个数开始遍历
if (a[i] != a[i-1]) { // 如果不与前一个数相同,则保留
a[k++] = a[i]; // 将其放到数组前面,k加1
}
}
return k; // 返回删除后数组中数据的个数
}
```
阅读全文