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;}测试这段代码
时间: 2023-03-21 22:02:26 浏览: 101
这段代码的作用是去重一个整数数组,并返回去重后数组的长度。在代码中,变量j用于记录不重复元素的个数,变量i用于遍历整个数组。当arr[i]不等于arr[j]时,将arr[i]赋值给arr[j],同时j自增1,表示已找到一个新的不重复元素。最后返回j+1,表示不重复元素的个数。
然而,这段代码中存在一个问题:循环变量i没有自增,导致代码会一直在循环中执行。需要将i自增,否则代码会进入死循环。
相关问题
优化这段代码int fun(int arr[4][5], int row, int col) { int sum = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (i == 0 || i == row - 1 || j == 0 || j == col - 1) { sum += arr[i][j]; } } } return sum;}
我们可以对原函数进行如下优化:
1. 将 `row` 和 `col` 定义为常量,避免传参时的错误。
2. 只需要遍历数组的四个角落,即左上、右上、左下、右下,其他边缘元素在这些角落中已经被计算过了。
3. 可以将边缘元素的坐标计算出来,而不是每次进行判断。这样可以减少判断的次数。
优化后的代码如下:
```c
#define ROW 4
#define COL 5
int fun(int arr[ROW][COL]) {
int sum = 0;
int corner[4][2] = {{0, 0}, {0, COL - 1}, {ROW - 1, 0}, {ROW - 1, COL - 1}};
for (int i = 0; i < 4; i++) {
int x = corner[i][0], y = corner[i][1];
sum += arr[x][y];
if (x != ROW - 1) sum += arr[x + 1][y];
if (y != COL - 1) sum += arr[x][y + 1];
if (x != ROW - 1 && y != COL - 1) sum += arr[x + 1][y + 1];
}
return sum;
}
```
这个函数中,我们将 `ROW` 和 `COL` 定义为常量,并定义一个二维数组 `corner`,其中存储了数组的四个角落的坐标。在循环中,我们遍历这四个角落,计算它们和它们相邻的元素的和,并将结果累加到 `sum` 中。最后,函数返回 `sum` 的值,即为二维数组周边元素之和。
代码改错#include <stdio.h> #define N 5 void fun(int arr[],int n) { int i=0; /**********Program**********/ for(i=0;i<N;i++) { int t=arr[i]; arr[i]=arr[N-(i+1)]; arr[N-(i+1)]=t; } /********** End **********/ } int main() { int a[N]={8,6,5,4,1},i; fun(arr[5],n) for(i=0;i<N;i++) printf("%4d",a[i]); printf("\n"); fun(a,N); for(i=0;i<N;i++) printf("%4d",a[i]); return 0; }
有几处问题需要修改:
1. 在函数调用时,应该传入数组a和数组长度N,而不是arr和n。因此,第22行应该改为:`fun(a,N);`
2. 在函数fun中,for循环的条件应该是`i<n`而不是`i<N`,因为n是传入的数组长度,而不是固定的5。因此,第4行应该改为:`void fun(int arr[],int n) {`
修改后的代码如下:
```
#include <stdio.h>
#define N 5
void fun(int arr[],int n) {
int i=0;
for(i=0;i<n;i++)
{
int t=arr[i];
arr[i]=arr[n-(i+1)];
arr[n-(i+1)]=t;
}
}
int main() {
int a[N]={8,6,5,4,1},i;
fun(a,N);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
fun(a,N);
for(i=0;i<N;i++)
printf("%4d",a[i]);
return 0;
}
```
阅读全文