遇上了才知道自己很容易忽略切片中的地址为引用 
                                                    
                        
                    
                    
  
                    
                    这是一个我在刷算法题的时候遇到的问题,困了我一个下午没想出来是为什么。
题目:子集
这是我出现问题的那版代码
可以明显的发现红框的两个地方其实是一个 leftArr ,但是在经过一次函数调用后就被修改了

为什么会出现这种情况呢?
让我们来分析一下代码,其实 search 函数是一个 前序遍历 ,内部有两个递归函数
所以 search 函数一开始会先执行第 19 行一直递归到 index == len(nums) 也就是 index == 5 时返回最后的 temp = [0, 3, 5, 7, 9]
既然代码的报错处 index = 3,我们就可以先从此时开始分析(画了个图方便看)

- 当 
index = 3时,temp = [0, 3, 5](先是一直走leftArr所以temp包含了前面的所有值) - 首先继续走 
leftArr,此时temp = [0, 3, 5, 7],因为最上面的结果图显示是第四个值被改变了,此时第四个值已经存在,所以index = 4之后可以不被考虑 - 然后返回 
index = 3,走rightArr,此时temp = [0, 3, 5],第四个索引处没有值 - 最后再走 
leftArr时,num[4] = 9赋值给了此时temp的第四个索引处导致temp = [0, 3, 5, 9] 
最后再看下各个时期的
temp吧
可以发现,虽然 temp 长度只有 3,但是 cap 却已经有 4
这就导致地址 temp[3] 的地址早已被分配,之后没对 temp[3] 做一次修改都会影响到之前的结果。
sob: 真的是头很痛啊,所以 slice 一定要谨慎呀。
本作品采用《CC 协议》,转载必须注明作者和本文链接
          
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: