[leetcode][two pointers] Remove Element

题目:

Given an array and a value, remove all instances of that value in place and return the new length.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.


方法一:首尾指针,若后面出现val,rear前移;前面出现val,用rear的元素填充front,然后front后移rear前移

int removeElement(vector<int>& nums, int val) {
	if (nums.empty()) return 0;
	int n = nums.size();
	int front = 0;//从头遍历数组
	int rear = n - 1;//指向新数组最后一个元素
	while (front < rear){
		if (nums[front] != val){
			++front;
			continue;
		}
		if (front < rear && nums[rear] == val) {
			--rear;
			continue;
		}
		nums[front] = nums[rear];//!!!front所指元素等于val且rear所指元素不等于val才能到这里,若所有元素都不等于val,就不能到这里,rear也不会减小
		++front;
		--rear;
	}
	if (nums[rear] == val) --rear;//!!!front == rear的那个元素没有判断过
	return rear+1;
}

方法二:从后向前扫描,发现val就用数组最后一个元素填充,然后数组长度减一

int removeElement(vector<int>& nums, int val) {
    int n = nums.size();
    for(int i = n - 1; i >= 0; --i){
        if(nums[i] == val){
            nums[i] = nums[n-1];
            --n;
        }
    }
    return n;
}

方法三:从前向后扫描,endNew指向新数组最后一个元素的下一个元素,发现非val元素就用其填充endNew,然后endNew后移一位

int removeElement(vector<int>& nums, int val) {
    int endNew = 0;
    for(int i = 0; i < nums.size(); ++i){
        if(nums[i] != val){
            nums[endNew++] = nums[i];
        }
    }
    return endNew;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机网络》文档包含了70个关于计算机网络基础知识的单项选择题,内容涉及互联网起源、网络协议、IP地址、DNS服务、电子邮件、网络拓扑结构、网络设备、网络连接方式、网络速度等多个方面。每个问题后面都提供了正确答案,适合作为学习和测试材料。 ### 适用人群 本文档适合以下人群: - 计算机科学与技术、信息技术、网络工程等专业的在校学生。 - 准备计算机网络相关考试或认证的专业人士。 - 对计算机网络基础知识感兴趣的自学者。 - 信息技术教师,作为教学资源或测试材料。 ### 使用场景及目标 1. **学习测试**:作为学生学习计算机网络理论知识后的测试工具,检验学习效果。 2. **教学辅助**:教师可以用于课堂教学,作为课后作业或课堂小测验,增强学生的理解和记忆。 3. **自学检验**:个人自学者可以通过这些题目检验自己对计算机网络基础知识的掌握程度。 4. **职业发展**:职场人士可以通过学习和测试,提升自己在计算机网络领域的专业能力。 5. **竞赛准备**:适合准备计算机网络相关竞赛的学生,作为强化训练材料。 文档的目标是通过这些精心设计的题目,帮助读者全面了解和掌握计算机网络的基本概念、原理和应用,提高解决实际问题的能力。通过学习和练习,读者将能够更加深入地理解计算机网络的工作原理,为进一步的专业学习或职业发展打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值