欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > c语言练习题

c语言练习题

2024/10/27 15:20:17 来源:https://blog.csdn.net/m0_74859128/article/details/143259685  浏览:    关键词:c语言练习题

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

给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 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 ,并初始化为空字符串。

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

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

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

代码:

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// 否则返回 falseif (result == 0) {return true;} else {return false;}
}

 思路2:

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

代码2:

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]) {// 不相等直接返回falsereturn 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. 输入有效性检查

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

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

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

代码:


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]) {// 交换heightsint tempHeight = heights[j];heights[j] = heights[j + 1];heights[j + 1] = tempHeight;// 交换nameschar* 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 函数的定义

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

代码:

// 比较函数,用于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;  // 返回最终结果
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com