力扣第一题:梦开始的地方

为了完成老师的任务,我开始进行一个力扣题库的刷。
一看第一题,两数相加,先拿来试试手吧!
点进去一看,好家伙,好像不是我想象中的a+b啊……

当然这也难不倒我啦!不就是两层for循环依次找元素,符合条件的输出出来么!
于是我自信满满地写了这样一段代码:

(此处我还完全没有注意到模板给的Note,或者说注意到了但不知道是啥意思)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i,j;
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                returnSize[0]=i;
                returnSize[1]=j;
                return returnSize;
            }
           
        }
    }
   
}

自以为该有的结构都有了,直接点运行不就拿下了么!
然后,他居然连编译都没过……直接打击到哥们了。
没过的理由是这样的:

 完全看不懂,没关系,我们直接运用浏览器大法搜一下怎么回事!
果然一下就找到了捏。附一下链接:(7条消息) warning: control reaches end of non-void function_猫咪的晴天的博客-CSDN博客
(7条消息) c++语法错误之control reaches end of non-void function[werror=return-type]_Oct11_F的博客-CSDN博客
哦,原来是少了一个return。好嘛,那我们补一个不就好了!
在末尾补一个return,该返回啥呢?给好的模板里有个*returnSize,不管了,随便赋一个值好了,反正题里也没要求,就 returnSize[0]=0 吧,可以说相当随意了:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i,j;
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                returnSize[0]=i;
                returnSize[1]=j;
                return returnSize;
            }
           
        }
    }
    returnSize[0]=0;
    return returnSize;
}

然后此处出现了新问题……

 这又是什么情况。继续 search on the Internet,附两个链接:
c - 是什么导致此“存储空间不足的地址”错误? - What is causing this "store to address with insufficient space" error? - 堆栈内存溢出 (stackoom.com)
主要说的是在调用malloc函数时出现了“申请一个存储指针的空间,指针本身很大,所以空间不够”的问题。显然returnSize是已经给好的一个指针,因为看不到main函数,我也不清楚返回的会是什么玩意,既然通不过就只能另寻他法。但是好像解决了又好像没解决,这个malloc是啥?我完全没用上,那我怎么改代码?
(7条消息) c语言代码中常遇到的坑,c语言写leetcode的常见坑_敬岁月敬纯真的博客-CSDN博客
这个对我来说就直接很多,说的是出现这种情况的话,有一种可能性就是没有写malloc。
此时我才注意到模板给的note:
//Note: The returned array must be malloced, assume caller calls free().
我想我得大改一下输出的这部分,因为必须要调用malloc函数……但是我完全不知道这是啥啊!
ok,继续查:
[C语言] 5分钟看懂什么是 malloc - 知乎 (zhihu.com)
再附上官方题解:
1. 两数之和 - 力扣(Leetcode)
ok,大概明白了,我再另外申请一个空间放数组,再返回这个数组地址就好~还要把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;
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
               int* ans= malloc(sizeof(int)*2);
               ans[0]=i,ans[1]=j;
                *returnSize=2;
                return ans;
            }
           
        }
    }
    *returnSize=0;
    return NULL;
}

终于过了!
至于为什么没有用到free(),我认为此处调用malloc已经是在if的前提下不会出现空指针,而且是在功能函数里,调用完之后空间即被销毁,所以可以不用free().


链接均为转载,侵删致歉。
我是一名初学者,如有错误,欢迎指出;如有意见或建议,欢迎留言交流!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值