每日记录leetcode刷题

发布时间:2024-02-07 10:30

首先还是先说明一下,本人是21刚刚跨考,考完研究生的一名学生,想记录一下自己的刷题历程,亦或者在日后有了更好的想法,或学习了新的语言再回来把这些文章重新整理一遍,也可以说我把这里当成了自己的一片小天地,所以喜欢呢,感谢你的赞美,而不喜欢呢,请把你的谩骂留在心里,谢谢。

/*
难度
简单
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那
两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。
但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Note: The returned array must be malloced, assume caller calls free(). */
int* twoSum(int* nums, int numsSize, int target,int *returnSize){
    int subscript[2]; 
	for (int i = 0; i < numsSize-1; i++) {
		for (int j = i + 1; j < numsSize; j++) {
			if (nums[i] + nums[j] == target) {
				subscript[0] = i;
				subscript[1] = j;
				return subscript;
			}
		}
	}
	return 0;
}

对于这个简单的题目,和求一个数组中的所有和的问题类似,解决这个问题的第一想法就是一个双循环然后把这个数组中所有数加起来一一和target的值对比,就结束了。

但第一次解决的时候遇到了
//AddressSanitizer: stack-buffer-overflow on address 0x7ffc10b09d84 at pc 0x55e79c9cdf1f bp 0x7ffc10b09c90 sp 0x7ffc10b09c80
我的猜测就是我在第一次解决问题的时候,没有定义subscript[2]数组,直接用了函数参数表*returnSize 的值导致了数组越界问题的发生。

并且这个问题的时间复杂度是O(n^2),但是应该解决这个问题应该会有更低复杂度的解法。

==========================

分割线

==========================
好了,没想到我来leetcode的第一天就被恶心吐了。我找到了报错的原因
是我没有注意到题目给的形参的含义: int* nums表示传进去一个数组的地址; int numsSize表示传进去的数组大小; int target表示数组中两数相加需要等于的值; int* returnSize表示返回的数组的大小(刚开始我以为这是返回的数组,所以一直出错)。
下面附上通过的代码

Note: The returned array must be malloced, assume caller calls free(). */

int* twoSum(int* nums, int numsSize, int target,int *returnSize){
	int i,j;	
    int *subscript =(int *)malloc(sizeof(int)*2);
	for (i = 0; i < numsSize-1; i++) {
		for (j = i + 1; j < numsSize; j++) {
			if (nums[i] + nums[j] == target) {
				subscript[0] = i;
				subscript[1] = j;
                *returnSize = 2;
				return subscript;
			}
		}
	}
    *returnSize = 0;
	return 0;
}

但我仍然觉得好坑啊,如果自己定义接口的话是不会发生这种情况的,如果面试也弄成这种形式,这题也太搞人心态了。但是在公司上班确实可能会遇到这种情况,毕竟包和接口不一定是一个人写的,但也应该给了明确的说明吧,题目就这么含糊其辞,确实有些过分。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号