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 ,并初始化为空字符串。
-
遍历第⼀个字符串数组,将其中的每个字符串依次利⽤strcat函数添加到str1 后⾯。
-
遍历第⼆个字符串数组,将其中的每个字符串依次利⽤strcat函数添加到str2 后⾯。
-
⽐较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:
- 初始化指针和索引 :首先,我们初始化两个指针
x
和y
分别指向两个字符串数组的起始位置,同时初始化两个索引i
和j
分别指向当前字符串的起始字符。 - 同时遍历 :我们使用一个
while
循环来同时遍历两个字符串数组。在循环中,我们比较当前指向的两个字符是否相等。 - 字符比较 :如果当前字符不相等,我们直接返回
false
,因为这意味着两个字符串数组不相等。如果相等,我们继续移动索引来比较下一个字符。 - 处理字符串结束:当我们遇到一个空字符(即字符串结束时),我们移动到下一个字符串,并重置索引为0,以便从下一个字符串的起始位置开始比较。
- 检查是否遍历完成 :最后,我们检查是否同时遍历完了所有的字符串。如果是,并且没有发现不相等的字符,我们返回
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
。
对于每个下标 i
,names[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
中的所有值互不相同
思路:
-
输入有效性检查:
- 首先检查
namesSize
和heightsSize
是否相等,确保每个名字都有对应的身高。 - 如果输入无效(如名字和身高数量不一致或都为零),则返回
NULL
并设置returnSize
为0
。
- 首先检查
-
使用冒泡排序:
- 由于身高和名字是成对存在的,因此需要同时对这两个数组进行排序。
- 外层循环遍历所有身高,内层循环用于比较相邻的身高,如果发现前一个身高小于后一个身高,则进行交换,同时确保对应的名字也进行同样的交换。
- 这样进行排序后,身高就可以按照从高到低的顺序排列,而名字数组会与身高数组保持一致。
-
返回排序结果:
- 最后,设置
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
思路:
-
排序每一行:
- 首先,对二维数组
grid
中的每一行进行排序。我们使用qsort
函数,并提供一个比较函数cmp_int
,它按照升序排列每一行的元素。 - 通过排序,每一行的最大值会移动到该行的末尾。
- 首先,对二维数组
-
计算每一列的最大值:
- 接下来,我们需要遍历每一列,找到每一列中的最大值,并将其累加到结果变量
result
中。 - 由于每一行已经排序,所以列的最大值是该列中最右边(即最大)的元素。我们从最后一列开始向前遍历,找出每一列的最大值。
- 接下来,我们需要遍历每一列,找到每一列中的最大值,并将其累加到结果变量
-
累加最大值:
- 对于每一列,我们初始化一个变量
max
为该列的第一个元素,然后遍历该列的所有行,更新max
为该列中的最大值。 - 将每一列的最大值累加到
result
。
- 对于每一列,我们初始化一个变量
-
返回结果:
- 最后,返回累加的结果
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; // 返回最终结果
}