力扣的第一题,两数之和,应该和四六级词汇书的第一个单词一样,每个人都见过

题目描述:

给定一个整数数组 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语言这个纯粹的代码。

最后修改:2023 年 08 月 25 日
如果觉得我的文章对你有用,请随意赞赏