c语言练习题

1检查两个字符串数组是否相等

给你两个字符串数组 word1word2 。如果两个数组表示的字符串相同,返回true;否则,返回 false

数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。

示例 1:

复制代码
输入:word1 = ["ab", "c"], word2 = ["a", "bc"]
输出:true
解释:
word1 表示的字符串为 "ab" + "c" -> "abc"
word2 表示的字符串为 "a" + "bc" -> "abc"
两个字符串相同,返回 true

示例 2:

复制代码
输入:word1 = ["a", "cb"], word2 = ["ab", "c"]
输出:false

示例 3:

复制代码
输入:word1  = ["abc", "d", "defg"], word2 = ["abcddefg"]
输出:true

提示:

  • 1 <= word1.length, word2.length <= 103
  • 1 <= word1[i].length, word2[i].length <= 103
  • 1 <= sum(word1[i].length), sum(word2[i].length) <= 103
  • word1[i]word2[i] 由小写字母组成

思路:利⽤字符串函数模拟过程。

1定义两个字符串str1 和str2 ,并初始化为空字符串。

  1. 遍历第⼀个字符串数组,将其中的每个字符串依次利⽤strcat函数添加到str1 后⾯。

  2. 遍历第⼆个字符串数组,将其中的每个字符串依次利⽤strcat函数添加到str2 后⾯。

  3. ⽐较str1 和str2 是否相等。如果相等,则输出true,否则输出false。

代码:

cs 复制代码
bool arrayStringsAreEqual(char** word1, int word1Size, char** word2, int word2Size) {
    int i = 0;
    char str1[1001] = {0};
    char str2[1001] = {0};
    
    // 将第一个字符串数组中的所有字符串合并到 str1 中
    for (int i = 0; i < word1Size; i++) {
        strcat(str1, word1[i]);
    }
    
    // 将第二个字符串数组中的所有字符串合并到 str2 中
    for (int i = 0; i < word2Size; i++) {
        strcat(str2, word2[i]);
    }
    
    // 比较合并后的两个字符串
    int result = strcmp(str1, str2);
    
    // 如果 result 为 0,表示两个字符串相等,返回 true
    // 否则返回 false
    if (result == 0) {
        return true;
    } else {
        return false;
    }
}

思路2:

  1. 初始化指针和索引 :首先,我们初始化两个指针 xy 分别指向两个字符串数组的起始位置,同时初始化两个索引 ij 分别指向当前字符串的起始字符。
  2. 同时遍历 :我们使用一个 while 循环来同时遍历两个字符串数组。在循环中,我们比较当前指向的两个字符是否相等。
  3. 字符比较 :如果当前字符不相等,我们直接返回 false,因为这意味着两个字符串数组不相等。如果相等,我们继续移动索引来比较下一个字符。
  4. 处理字符串结束:当我们遇到一个空字符(即字符串结束时),我们移动到下一个字符串,并重置索引为0,以便从下一个字符串的起始位置开始比较。
  5. 检查是否遍历完成 :最后,我们检查是否同时遍历完了所有的字符串。如果是,并且没有发现不相等的字符,我们返回 true,否则返回 false

代码2:

cs 复制代码
bool arrayStringsAreEqual(char ** word1, int word1Size, char ** word2, int word2Size) {
    // 定义指向字符串数组的指针指向数组起始位置
    // 并定义两个变量指向两个字符串的字符位置
    int x = 0, y = 0, i = 0, j = 0;

    // 同时遍历两个字符串数组
    while (x < word1Size && y < word2Size) {
        // 比较当前指向的两个字符是否相等
        if (word1[x][i] != word2[y][j]) {
            // 不相等直接返回false
            return false;
        }

        // 指向字符的变量后移
        i++;

        // 如果指针当前指向空字符(即字符串结束),则遍历下一个字符串,并且重新初始化字符指针
        if (word1[x][i] == '\0') {
            x++;
            i = 0;
        }

        // 同上,对第二个字符串数组进行操作
        j++;
        if (word2[y][j] == '\0') {
            y++;
            j = 0;
        }
    }

    // 若两个字符串遍历同时结束并未发现不相同字符时返回true,否则返回false
    // 这里判断的是是否同时遍历完了所有的字符串
    return x == word1Size && y == word2Size;
}

2按身高排序

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n

对于每个下标 inames[i]heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names

示例 1:

复制代码
输入:names = ["Mary","John","Emma"], heights = [180,165,170]
输出:["Mary","Emma","John"]
解释:Mary 最高,接着是 Emma 和 John 。

示例 2:

复制代码
输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出:["Bob","Alice","Bob"]
解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。

提示:

  • n == names.length == heights.length
  • 1 <= n <= 103
  • 1 <= names[i].length <= 20
  • 1 <= heights[i] <= 105
  • names[i] 由大小写英文字母组成
  • heights 中的所有值互不相同

思路:

  1. 输入有效性检查

    • 首先检查 namesSizeheightsSize 是否相等,确保每个名字都有对应的身高。
    • 如果输入无效(如名字和身高数量不一致或都为零),则返回 NULL 并设置 returnSize0
  2. 使用冒泡排序

    • 由于身高和名字是成对存在的,因此需要同时对这两个数组进行排序。
    • 外层循环遍历所有身高,内层循环用于比较相邻的身高,如果发现前一个身高小于后一个身高,则进行交换,同时确保对应的名字也进行同样的交换。
    • 这样进行排序后,身高就可以按照从高到低的顺序排列,而名字数组会与身高数组保持一致。
  3. 返回排序结果

    • 最后,设置 returnSize 为排序后的数组大小,并返回排序后的 names 数组。

代码:

cs 复制代码
char** sortPeople(char** names, int namesSize, int* heights, int heightsSize, int* returnSize) {
    // 检查输入的有效性
    if (namesSize != heightsSize || namesSize == 0 || heightsSize == 0) {
        *returnSize = 0;
        return NULL;  // 如果输入无效,返回NULL并设置returnSize为0
    }

    // 进行冒泡排序,根据heights从大到小排序,同时交换names中的对应项
    for (int i = 0; i < heightsSize - 1; i++) {
        for (int j = 0; j < heightsSize - 1 - i; j++) {
            if (heights[j] < heights[j + 1]) {
                // 交换heights
                int tempHeight = heights[j];
                heights[j] = heights[j + 1];
                heights[j + 1] = tempHeight;

                // 交换names
                char* tempName = names[j];
                names[j] = names[j + 1];
                names[j + 1] = tempName;
            }
        }
    }

    // 设置returnSize并返回排序后的names数组
    *returnSize = namesSize;
    return names;
}

3删除每行中的最大值

给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。

执行下述操作,直到 grid 变为空矩阵:

  • 从每一行删除值最大的元素。如果存在多个这样的值,删除其中任何一个。
  • 将删除元素中的最大值与答案相加。

注意 每执行一次操作,矩阵中列的数据就会减 1 。

返回执行上述操作后的答案。

示例 1:

复制代码
输入:grid = [[1,2,4],[3,3,1]]
输出:8
解释:上图展示在每一步中需要移除的值。
- 在第一步操作中,从第一行删除 4 ,从第二行删除 3(注意,有两个单元格中的值为 3 ,我们可以删除任一)。在答案上加 4 。
- 在第二步操作中,从第一行删除 2 ,从第二行删除 3 。在答案上加 3 。
- 在第三步操作中,从第一行删除 1 ,从第二行删除 1 。在答案上加 1 。
最终,答案 = 4 + 3 + 1 = 8 。

示例 2:

复制代码
输入:grid = [[10]]
输出:10
解释:上图展示在每一步中需要移除的值。
- 在第一步操作中,从第一行删除 10 。在答案上加 10 。
最终,答案 = 10 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • 1 <= grid[i][j] <= 100

思路:

  1. 排序每一行

    • 首先,对二维数组 grid 中的每一行进行排序。我们使用 qsort 函数,并提供一个比较函数 cmp_int,它按照升序排列每一行的元素。
    • 通过排序,每一行的最大值会移动到该行的末尾。
  2. 计算每一列的最大值

    • 接下来,我们需要遍历每一列,找到每一列中的最大值,并将其累加到结果变量 result 中。
    • 由于每一行已经排序,所以列的最大值是该列中最右边(即最大)的元素。我们从最后一列开始向前遍历,找出每一列的最大值。
  3. 累加最大值

    • 对于每一列,我们初始化一个变量 max 为该列的第一个元素,然后遍历该列的所有行,更新 max 为该列中的最大值。
    • 将每一列的最大值累加到 result
  4. 返回结果

    • 最后,返回累加的结果 result

qsort 函数的定义

cs 复制代码
void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));
  • base: 指向要排序数组的指针(可以是任意类型的数组)。
  • num: 数组中的元素数量。
  • size: 每个元素的大小(以字节为单位)。
  • compar: 比较函数,用于比较两个元素。该函数接收两个参数,这两个参数都是 void* 类型,因此在比较函数内部需要进行类型转换。

代码:

cs 复制代码
// 比较函数,用于qsort排序
int cmp_int(const void* e1, const void* e2) {
    return *(int*)e1 - *(int*)e2;
}

int deleteGreatestValue(int** grid, int gridSize, int* gridColSize) {
    int result = 0;  // 初始化结果变量

    // 对每一行进行排序
    for (int i = 0; i < gridSize; i++) {
        qsort(grid[i], gridColSize[i], sizeof(int), cmp_int);
    }

    // 计算每一列中的最大值并累加
    for (int y = gridColSize[0] - 1; y >= 0; y--) {
        int max = grid[0][y];  // 初始化当前列的最大值
        for (int j = 1; j < gridSize; j++) {
            if (max < grid[j][y]) {
                max = grid[j][y];  // 更新最大值
            }
        }
        result += max;  // 累加最大值到结果中
    }

    return result;  // 返回最终结果
}
相关推荐
kyriewen7 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端7 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员8 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为8 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid8 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger9 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
用户298698530149 小时前
Java 实现 Word 文档加密与权限解除
java·后端
lichenyang4539 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang4539 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
Yeats_Liao9 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构