两数之和 TWO SUM
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
初解:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i=0,j=0;
while(nums[i]+nums[j]!=target){
for(i=0;i<numsSize;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i] + nums[j] == target){
printf("[%d,%d]",i,j);
}
}
}
}
return 0;
}
运行结果:
一开始我没明白这个错误是为啥,按输出结果来说结果应该是正确的(去掉中括号以后也不对),具体错误信息如下(好像是说堆溢出?):
=================================================================
29ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000020 at pc 0x0000004019ab bp 0x7ffcb39f9e20 sp 0x7ffcb39f9e18
READ of size 4 at 0x602000000020 thread T0
#2 0x7fa483b9f2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
0x602000000020 is located 0 bytes to the right of 16-byte region [0x602000000010,0x602000000020)
allocated by thread T0 here:
#0 0x7fa48544e2b0 in malloc (/usr/local/lib64/libasan.so.5+0xe82b0)
#3 0x7fa483b9f2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
Shadow bytes around the buggy address:
0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa 00 00[fa]fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
29ABORTING
第一次修正代码:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i=0,j=0;
for(i=0;i<numsSize;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i] + nums[j] == target){
printf("[%d,%d]",i,j);
}
}
}
return 0;
}
第一次错误原因呢是多加了while语句导致堆栈溢出了,仔细一想好像确实也没必要,两个for循环就解决了,待我有时间需要查一查具体的原因。
再次运行,又出错了:
Line 207: Char 3: runtime error: load of null pointer of type ‘int’ (Serializer.c)
这次我明白了,因为题目要求函数返回类型为int*,而我的返回类型为整数int型,返回错误。
第二次修改代码:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *a = (int *)malloc(sizeof(int) * 2);
int i, j;
for (i = 0; i < numsSize - 1; i++) {
for (j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
a[0] = i;
a[1] = j;
*returnSize = 2;
return a;
}
}
}
*returnSize = 0;
return a;
}
顺利完成get√!
后记
现在是2020年1月13日,计划从现在开始每天认真练习做算法题,记住自己错误的地方,以后尽量少犯错,希望自己能坚持下来,无论以后是否会成为一个程序猿,都要努力提升自己。
每天一小步,日积月累就是一大步!