一.题目
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
二.代码
int* twoSum(int* nums, int numsSize, int target,int* returnSize)
{static int a[2]={0};for(int i=0;i<numsSize-1;i++){for(int j=i+1;j<numsSize;j++){if(nums[i]+nums[j]==target){a[0]=i;a[1]=j;* returnSize=2;return a;}}}return NULL;
}
三.代码解读
1.函数参数
int* nums
:指向整数数组的指针,这个数组包含了要进行查找操作的元素。int numsSize
:表示数组nums
的元素个数,用于控制循环的边界,确保不会越界访问数组元素。int target
:需要寻找的两个数之和的目标值。int* returnSize
:一个指针,用于将找到的满足条件的元素个数,返回给调用者。
2.static作用
使用static
可以保证在函数返回后,所指向的数组内容依然有效(因为其生命周期贯穿整个程序运行阶段),使得调用者能够正确获取到在函数内部计算并存储好的满足条件的两个下标的值(存储在a
数组中)。如果不用static
,在函数返回后,原本的局部数组所在内存被释放回收,那么返回的指针就变成了悬空指针,指向的是无效的内存区域,后续再去访问就会出现错误(比如出现未定义行为,可能导致程序崩溃等)。
3.循环逻辑
- 外层循环:通过
for (int i = 0; i < numsSize - 1; i++)
控制,从数组的第一个元素开始,依次遍历到倒数第二个元素(因为内层循环会从i + 1
开始处理后面的元素,这样可以避免重复的元素组合情况) - 内层循环:
for (int j = i + 1; j < numsSize; j++)
,在内层循环中,对于外层循环当前遍历到的元素nums[i]
,从它后面的元素(即nums[i + 1]
开始)依次往后遍历整个数组,直到数组末尾。
四.补全代码
#include <stdio.h>
#include <stdlib.h>// twoSum函数定义,功能是在给定数组中找两数之和等于目标值的两个元素下标
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{static int a[2] = {0};for (int i = 0; i < numsSize - 1; i++){for (int j = i + 1; j < numsSize; j++){if (nums[i] + nums[j] == target){a[0] = i;a[1] = j;*returnSize = 2;return a;}}}return NULL;
}int main()
{int numsSize;printf("请输入数组元素个数:");scanf("%d", &numsSize);int* nums = (int*)malloc(numsSize * sizeof(int));if (nums == NULL){perror("内存分配失败");return -1;}printf("请依次输入数组元素:");for (int i = 0; i < numsSize; i++){scanf("%d", &nums[i]);}int target;printf("请输入目标值:");scanf("%d", &target);int returnSize;int* result = twoSum(nums, numsSize, target, &returnSize);if (result!= NULL){printf("找到满足条件的两个下标为:%d 和 %d\n", result[0], result[1]);}else{printf("未找到满足条件的两个数之和。\n");}free(nums);return 0;
}