Remove Duplicates from Sorted List

本文介绍了一种算法,该算法可以有效地移除已排序链表中的所有重复元素,确保每个元素仅出现一次。通过迭代遍历链表并比较相邻节点的值来实现重复项的删除。


Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        ListNode *tmp=head,*p;
        if(head==NULL)
            return head;
        while(tmp)
        {
            p=tmp->next;
            while(p)
            {
                if(tmp->val==p->val)
                  tmp->next=p->next;//delete a duplicate
                else 
                    break;
                 p=p->next;
            }
            tmp=p;//注意循环的末尾和初始条件
        }
        return head;
    }
};

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {
        ListNode *tmp=head,*p;
        if(head==NULL)
            return head;
        while(tmp)
        {
            p=tmp->next;
            while(p)
            {
                if(tmp->val==p->val)
                  tmp->next=p->next;//delete a duplicate
                else 
                    break;
                 p=p->next;
            }
            tmp=p;//注意循环的末尾和初始条件
        }
        return head;
    }
};

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)内容概要:本文围绕基于粒子群算法(PSO)优化Kmeans聚类的居民用电行为分析展开研究,提出了一种结合智能优化算法与传统聚类方法的技术路径。通过使用粒子群算法优化Kmeans聚类的初始聚类中心,有效克服了传统Kmeans算法易陷入局部最优、对初始值敏感的问题,提升了聚类的稳定性和准确性。研究利用Matlab实现了该算法,并应用于居民用电数据的行为模式识别与分类,有助于精细化电力需求管理、用户画像构建及个性化用电服务设计。文档还提及相关应用场景如负荷预测、电力系统优化等,并提供了配套代码资源。; 适合人群:具备一定Matlab编程基础,从事电力系统、智能优化算法、数据分析等相关领域的研究人员或工程技术人员,尤其适合研究生及科研人员。; 使用场景及目标:①用于居民用电行为的高效聚类分析,挖掘典型用电模式;②提升Kmeans聚类算法的性能,避免局部最优问题;③为电力公司开展需求响应、负荷预测和用户分群管理提供技术支持;④作为智能优化算法与机器学习结合应用的教学与科研案例。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解PSO优化Kmeans的核心机制,关注参数设置对聚类效果的影响,并尝试将其应用于其他相似的数据聚类问题中,以加深理解和拓展应用能力。
你的代码的目的是去除数组中重复的元素,并将去重后的元素放回原数组 `nums` 的前面,返回去重后的长度。然而,这段代码存在一些问题: --- ### ✅ 正确的逻辑应该是: 1. 遍历数组,跳过连续相同的元素。 2. 将不重复的元素保存到一个新的结构里。 3. 最后把结果写回到原数组的前部。 --- ## ❌ 存在的问题分析: ### 问题 1:`j` 被赋值为 `i + 1` 后,你没有处理越界情况 ```java int j = i+1; if (j<=nums.length - 1&& nums[j] == nums[i]){ ``` 虽然你在判断 `j <= nums.length - 1`,但后续的 while 循环没有再次检查边界: ```java while (nums[j] == nums[i]){ j++; } ``` 当 `j` 超出数组范围时会抛出 `ArrayIndexOutOfBoundsException`。 --- ### 问题 2:`i = j;` 导致跳过了一个元素 例如数组是 `[1,1,1]`,当你在 `i=0`,进入 `while` 循环后 `j` 增加到了 3(超出数组),然后你执行了 `i = j`,此时 `i = 3`,循环结束。实际上你应该只保留第一个 `1`,其余跳过,但你并没有正确地控制这个过程。 --- ### 问题 3:`sorted.add(nums[i]);` 在某些情况下会重复添加元素 --- ## ✅ 正确的 Java 实现(使用双指针法) 下面是一个更高效、简洁、标准的实现方式: ```java class Solution { public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int i = 0; // 指向不重复元素的最后一个位置 for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; // 只有不相等的时候才移动指针 nums[i] = nums[j]; // 把不重复的元素放到前面 } } return i + 1; // 返回新数组的长度 } } ``` --- ### 🔍 代码解释: - 使用两个指针 `i` 和 `j`: - `j` 是快指针,用来遍历整个数组; - `i` 是慢指针,指向当前不重复部分的最后一个位置。 - 当发现 `nums[j] != nums[i]` 时,说明遇到了新的不重复元素: - 先让 `i++`,腾出位置; - 然后把 `nums[j]` 的值复制过来。 - 最终 `[0...i]` 就是去重后的数组内容,长度为 `i+1`。 --- ### 🧪 示例输入输出: 输入: ```java int[] nums = {0,0,1,1,1,2,2,3,3,4}; ``` 输出: ```java // 修改后的 nums 前5位为 [0,1,2,3,4] // 返回值为 5 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值