Vector<int> nums;
一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
一道非常简单的力扣题,在用vector处理时出现了以下问题;
1.
测试用例[1,1,2]
输出结果[1]
返回size=1;
原因以及解决办法:it迭代器指向最后一个元素的后一个位置,如图
输出
解决办法将it!=nums.end()改为it!=nums.end()-1;
2.
在问题1的测试过程中发现最后一个元素总是会被删除(在自己的测试用例中最后一个元素没有重复项,不应该被删除),按照图一的逻辑应该只删除重复元素。
int s[7]={1,2,2,3,4,4,7};
将此数组存到vector中再用erase按照图一的逻辑删除重复元素。
原因以及解决办法:
测试将nums按照删除前的大小输出,发现得到的结果为
1 2 3 4 7 7 7
说明erase操作仅将容器的尾指针前移了,删除位置后的元素全部前移覆盖前面的元素,但并没有删除原来的数据,由于vector申请的是一片连续的空间,所以在比较最后一对元素的过程中,由于问题一没有解决,便将删除后nums的最后一个元素7与指向最后一个元素后一个位置(it.end())的元素比较,原来的7没有删除,比较之后重复便将7删掉了。
总结:vector申请连续空间,当vector扩容时并不是在原来的基础上增加空间,而是申请一片更大的连续空间将数据全部复制过去。删除元素时不需要增加空间所以保持原来的空间不变,又空间连续,所以即便删除后nums.size()会变小,但当指针超出size但没有超出原空间大小时不会发生越界。指针返回的数据为原来存储在此地址的数据。