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 07:02:26 浏览: 85
这段代码的作用是去重一个整数数组,并返回去重后数组的长度。在代码中,变量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` 的值,即为二维数组周边元素之和。
int** fun (int n);
这是一个函数声明,函数名为 fun,返回值类型为 int**,参数列表中有一个 int 类型的参数 n。该函数的功能是动态生成一个 n * n 的二维数组,并返回该数组的指针。具体实现可以参考下面的代码:
```c++
int** fun(int n) {
int** arr = new int*[n];
for (int i = 0; i < n; i++) {
arr[i] = new int[n];
}
return arr;
}
```
其中,第一行动态生成一个指针数组,该数组有 n 个元素,每个元素都是指向一个 int 类型的一维数组的指针。接下来的 for 循环遍历指针数组,为每个指针分别动态生成一个长度为 n 的一维数组。最后返回指针数组的首地址。需要注意的是,在调用完该函数后,需要手动释放动态分配的内存,否则会导致内存泄漏。