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;  // 返回最终结果
}
相关推荐
hn小菜鸡1 小时前
LeetCode 2058.找出临界点之间的最小和最大距离
算法·leetcode·职场和发展
liuyang-neu1 小时前
力扣 简单 70.爬楼梯
java·算法·leetcode
IronmanJay1 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组
OT.Ter1 小时前
【力扣打卡系列】二分查找(搜索旋转排序数组)
算法·leetcode·职场和发展·go·二分查找
J_z_Yang1 小时前
LeetCode 202 - 快乐数
c++·算法·leetcode
pengpeng021 小时前
力扣每日一题 685. 冗余连接 II
算法·leetcode
码农幻想梦1 小时前
实验九 视图的使用
前端·数据库·oracle
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
加载中loading...2 小时前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节