一、绪
由于这段时间,杭电acm网站莫名就崩了,所以我就开始在LeetCode网开始我的新征程啦!
其实一年前,我就接触过LeetCode网,但是当时我完全不明白要怎么编出怎样的程序来满足题意。包括我现在重新再看LeetCode网的评论时,去寻找怎么读懂题意的方法,但是评论区不乏像“看不懂”、“大三连第一题都看不懂”、“研一连第一题都看不懂”的此类评论。
其实,就我本人做过其它刷题网站(杭电acm等网站)的经验来讲,LeetCode有挺多不太一样的地方。比如说,它不会告诉你输入输出严格按什么格式来,你只能依靠注释和参数、一些过程去判断怎么编程。而且不同编程语言,它会对你的编程有不同的具体要求。这些特别之处,还需要在后续的刷题过程中慢慢体会,适应。
所以,我决定在这里记录一下我的做题历程吧,供其他人看懂LeetCode网。
二、两数之和
链接: 两数之和.
(一)题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
解释:题目描述已经很清晰了,并且将该题本来应该有的难度大大降低了。大家只要把数组里的相加之和等于target值得两个数字的下标返回即可。不需要考虑有多种满足结果组合的情况,也不需要考虑下标的返回顺序问题。但是,注意两个数字不能是同一个下标位置的数字,必须是在数组内两个不位置的元素。
在这个理解下,我们就可以开始解题了!
解题思路:
- 这里我使用的编程语言是C语言,算法采用的是暴力解法。
- 将编程语言设置为C语言时,就会出现下图:
这里告诉我们什么信息呢?
(1)注释:必须采用malloc函数为返回的数组分配内存
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
(2)int* twoSum(…)说明返回值是一个指针,即存放两个结果下标的数组;
(3)括号里有四个形参,分别是nums数组、nums数组长度、target值,最后一个是returnSize特地用了指针接实参,说明是想要改变或从twoSum中得到除结果数组以外的一个整型值,见名知意,应该就是记录结果数组的长度。通过前面的题意解释,我们知道这个结果数组的长度应该等于2,对应两个需要返回的下标值。
(二)AC代码
在满足了解题思路后,我终于成功通过了。果然,LeetCode挺不一样的,它不要求你写出完整代码,只需要你写出能够运算出满足题意结果的函数即可。代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int* array=NULL;
for(int i=0;i<numsSize-1;i++){
for(int j=i+1;j<numsSize;j++){
if(nums[i]+nums[j]==target){
array=(int *)malloc(2*sizeof(int));
array[0]=i;
array[1]=j;
*returnSize = 2;
return array;
}
}
}
return array;
}