删除排序数组中的重复项--leetcode算法题

本文介绍了解决LeetCode上一道经典题目——删除排序数组中重复元素的方法。通过两种解题思路,一是循环遍历并删除重复元素,二是采用双指针技巧,实现原地删除重复项并返回新数组长度。文章详细解析了每种方法的实现过程及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来自于leetcode

题目描述:

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。

示例2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

解题思路:

1:循环原数组;判断数组中是否只有一个当前下标的值,如果有超出一个则删除,否则进入下一个循环

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    for(let i = 0, l = nums.length; i < l; i++){
        while(nums.indexOf(nums[i]) > -1 && nums.indexOf(nums[i]) !== nums.lastIndexOf(nums[i])){
            nums.splice(nums.lastIndexOf(nums[i]),1)
        }
    }
    return nums.length;
};

2:利用双指针方法
定义一个指针j,在循环数组的时候如果有和arr[j]不相同的值,则j+1;所以最后j的数字代表与arr[0]的不相同的值得数量;所以还需要再把j+1之后返回

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    const len = nums.length;
    if(len === 0){
        return 0;
    }
    let j = 0;
    for(let i = 0; i < len; i++){
        if(nums[i] !== nums[j]){
            j += 1;
            nums[j] = nums[i];
        }
    }
    return j + 1;
};

转载于:https://www.cnblogs.com/guojikun/p/11423229.html

<think>好的,用户想知道如何高效准备计算机专业的素质测试。首先,我需要明确计算机专业的素质测试通常包括哪些内容。根据提供的引用资料,比如引用[2]和引用[4],这类测试可能涉及编程能力、算法理解、系统设计、信息检索能力以及心理素质等方面。 接下来,用户需要高效的方法和资源。根据引用[1]提到的信息素质教育,应该结合图书馆资源和在线平台,比如LeetCode或牛客网进行编程练习。同时,引用[3]和[4]提到的测评系统可能包含实际项目案例,所以实践项目经验也很重要。 然后,我需要考虑如何结构化回答。分步骤建议可能更清晰,比如分为基础巩固、实战训练、资源利用、心理准备等。每个部分需要具体的方法和推荐的资源,例如使用MOOC课程补充理论知识,利用开源项目锻炼实操能力。 还要注意用户可能的深层需求,比如时间有限,需要重点突破。可能需要强调的重要性,尤其是算法,同时结合系统设计的基础知识。另外,引用[1]提到的信息检索能力,可以建议如何高效查找资料和利用论坛解决问。 最后,确保推荐资源可靠且免费或经济实惠,比如MySQL、Eclipse这些开源工具,以及Coursera、edX的免费课程。同时提醒进行模拟测试,引用[2]中的测评系统模块可能包含考试管理功能,类似模拟环境对备考有帮助。</think>### 如何高效准备计算机专业素质测试? #### 一、明确测试内容与目标 计算机专业素质测试通常包含以下核心模块(参考引用[2][4]): - **编程能力**:算法实现(如快速排序)、数据结构应用 - **系统设计**:数据库(如MySQL)、框架(如SSM、Flask) - **信息素养**:文献检索、数据分析(参考引用[1]) - **综合能力**:项目开发流程、调试与优化 - **心理素质**:压力测试应对(参考引用[3][4]) #### 二、分阶段高效准备方法 1. **基础巩固阶段**(2-4周) - **算法与数据结构**:每天5道LeetCode目(建议从简单到困难) ```python # 示例:快速排序实现(参考示例代码) def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[0] return quick_sort([x for x in arr[1:] if x < pivot]) + [pivot] + quick_sort([x for x in arr[1:] if x >= pivot]) ``` - **系统设计基础**:掌握MySQL基本操作(建表、查询、索引) $$SELECT * FROM student WHERE major='计算机' LIMIT 10;$$ - **推荐资源**: - 《算法导论》+ 浙江大学数据结构公开课(中国大学MOOC) - MySQL官方文档(dev.mysql.com/doc) 2. **实战提升阶段**(3-6周) - **项目开发训练**:完成一个完整项目(如引用[3]的心理测评系统) - 前端:HTML/CSS + JavaScript - 后端:Python/Flask或Java/SSM(参考引用[3][4]) - **代码规范**:使用Git进行版本控制,每天提交代码 - **推荐平台**: - GitHub开源项目(搜索"学生管理系统"等关键词) - 阿里云天池/AI Studio竞赛平台 3. **模拟冲刺阶段**(1-2周) - **全真模拟**:使用牛客网/LeetCode模拟笔试 - **压力测试**:完成限时编程任务(如2小时完成简单系统设计) - **错复盘**:建立错文档,标注错误类型(如引用[2]中的考试管理模块) #### 三、关键资源推荐 | 资源类型 | 推荐内容 | 特点 | |----------------|-----------------------------------|--------------------------| | 编程练习 | LeetCode/牛客网 | 企业真+竞赛库 | | 项目实战 | GitHub Trending项目 | 真实开发场景 | | 文献检索 | 知网/IEEE Xplore(通过校园网访问)| 培养学术素养(参考[1]) | | 心理调适 | 正念冥想APP(如Headspace) | 应对压力测试(参考[4]) | #### 四、注意事项 1. **时间管理**:采用番茄工作法(25分钟专注+5分钟休息) 2. **健康维护**:保证每天7小时睡眠,避免熬夜编程 3. **工具准备**: - 开发环境:VSCode(轻量级)或Eclipse(Java项目) - 调试工具:Postman(API测试)+ Chrome DevTools
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值