力扣的第一题,两数之和,应该和四六级词汇书的第一个单词一样,每个人都见过
题目描述:
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
好吧,用惯了py和js,用C语言感觉无从下手,py的dict真好啊,js的map真好啊😂C语言咋啥都没有啊,直接让ChatGPT来吧!
ChatGPT给出的答案(我加了一些注释):
#include <stdio.h>
#include <stdlib.h> // ChatGPT没加这个头文件,但是使用qsort函数要
// 声明一个结构体来保存数字和其索引的映射
typedef struct {
int value; // 题目输入数组的元素索引对应的元素值
int index; // 题目输入数组的元素索引
} Map;
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
// 创建一个映射数组,结构体元素组成的数组
Map map[numsSize];
for (int i = 0; i < numsSize; i++) {
map[i].value = nums[i];
map[i].index = i;
}
// 对映射数组进行排序,qsort是内置函数,看名字就知道是快速排序,在stdlib.h中
qsort(map, numsSize, sizeof(Map), compare);
// 使用双指针法在排序后的数组中查找两数之和
int left = 0, right = numsSize - 1; // 左右指针
while (left < right) {
int sum = map[left].value + map[right].value;
if (sum == target) {
int* result = (int*)malloc(2 * sizeof(int)); // 创建空数组
result[0] = map[left].index;
result[1] = map[right].index;
*returnSize = 2; // 设置数组大小的值
return result;
} else if (sum < target) {
left++;
} else {
right--;
}
}
return NULL; // 没有找到符合条件的结果
}
// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
return ((Map*)a)->value - ((Map*)b)->value;
}
int main() {
int nums[] = {2, 7, 11, 15};
int target = 9;
int numsSize = sizeof(nums) / sizeof(nums[0]);
int returnSize;
int* result = twoSum(nums, numsSize, target, &returnSize);
if (result != NULL) {
printf("结果索引为:%d 和 %d\n", result[0], result[1]);
free(result);
} else {
printf("没有找到符合条件的结果\n");
}
return 0;
}
就喜欢C语言这个纯粹的代码。