m0_61574664 2021-12-31 01:22 采纳率: 87.1%
浏览 71
已结题

删除排序数组中的重复项,力扣原题,来个修改指正

void dee(vector&nums)
{
*val->nums;*dec=*val->next;
if (!nums)
{
return;
}
while (dec)
{
if (val != dec)
{
dec = dec->next;
}
else
{
nums.delete[dec];
dec = dec->next;
}
}
val = val->next;
}
class Solution
{
public:
int removeDuplicates(vector&nums)
{
while(val)
{
dee(&nums);
}
return nums.size(),nums;
}
}
这是我写的程序,我知道我写的有错误,我希望来个大佬在我的基础上改正正确并指出错误知识点,这是我的要求,希望来个负责任认真的大佬,如果整体拥有大错误希望能详细指正,最好要在我思路上进行改正,题简单,不能满足我要求的大佬就不要浪费时间了

  • 写回答

2条回答 默认 最新

  • 广大菜鸟 2021-12-31 10:09
    关注

    你程序的问题:
    1、vector&nums 没有指明类型(可能是csdn显示问题)
    2、返回类型问题int 却是return nums.size(),nums;
    3、vector类型操作没有delete[],函数应该是()
    vector相关函数:
    •insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置l...
    •push_back() 在Vector最后添加一个元素(参数为要插入的值) 删除元素:
    •clear() 清空所有元素 empty() 判断Vector是否为空(返回tr...
    •erase() 删除指定元素 (可以用指针来代替迭代器)
    4、val和dec,我不知道是啥类型,竟然有next,我刚刚去看了题目就给了个vector类型,vector也没next指针啊
    我给你个万能的删除排序数组中的重复项,至多保留k个的模板,当然我用的是双指针法,题目明确说了可以保存
    后面的不用删,只需要返回有效长度作len
    其实,双指针也没什么可怕的,就是一个走快点,然后与慢的那个比,同了就快的继续走;不同了就复制给慢的,慢的成为它自己的下一位,快的继续走,循环往复,直到快的走完

    #include<iostream>
    #include<vector>
    using namespace std;
    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            int high=nums.size();
            int slow=0;
            int k=1;//最多保留k位相同数字
            for(int j=0;j<high;j++){
                if(slow<k||nums[slow-k]!=nums[j])
                    nums[slow++]=nums[j];
            }
            return slow;
        }    
    };
    int main(){
        vector<int>nums;
        int tmp[]={1,1,2};
        for(int i=0;i<(int)(sizeof(tmp)/sizeof(int));i++)
            nums.push_back(tmp[i]);
        int len = Solution().removeDuplicates(nums);
        cout<<len<<",";
        for (int i = 0; i < len; i++) {
            cout<<nums[i]<<" ";
        }    
    }
    
    

    img


    对了,你也可以按照你那个思路,遍历同时删除重复元素,真正意义上的删除

    #include<iostream>
    #include<vector>
    using namespace std;
    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if(nums.size()==0) return 0;
            vector<int>::iterator it, it1;
            for (it = ++nums.begin(); it != nums.end();)
            {
                it1 = find(nums.begin(), it, *it);
                if (it1 != it)
                    it = nums.erase(it);
                else
                    it++;
            }
            return nums.size();
        }
    };
    int main() {
        vector<int>nums;
        int tmp[] = { 1,1,2 };
        for (int i = 0; i < (int)(sizeof(tmp) / sizeof(int)); i++)
            nums.push_back(tmp[i]);
        int len = Solution().removeDuplicates(nums);
        cout << len << ",";
        for (int i = 0; i < len; i++) {
            cout << nums[i] << " ";
        }
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂