首页 > 其他分享 >【leetcode】数组篇刷题 --删除元素

【leetcode】数组篇刷题 --删除元素

时间:2024-02-23 19:46:58浏览次数:16  
标签:rp lc nums -- leetcode int lp 篇刷题 string

// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem27.h"

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=27 lang=cpp
 *
 * [27] 移除元素
 */

// @lc code=start
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {

    //原地移除,返回arr长度,不必考虑元素顺序

    //快慢指针
    //rp用于遍历完数组
    //lp用于更新数值,lp永远指向下一个可用于更新数值的坑位
    int lp = 0;
    int rp = 0;
    while(rp < nums.size()){
        if(nums[rp] != val ){
            nums[lp] = nums[rp];
            lp++;
            }
        rp++;
    }
    return lp;
    }
};
// @lc code=end


/*
 * @lc app=leetcode.cn id=26 lang=cpp
 *
 * [26] 删除有序数组中的重复项
 */

// @lc code=start
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int lp = 0;
        int rp = 1;
        while(rp < nums.size()){
            if(nums[lp] != nums[rp]){
                lp++;
                nums[lp] = nums[rp];
            }
            rp++;
        }
    //不同于上一题,这里的lp指针指向当前已确认的元素,而不是指向存放下一个确认元素的空位
    return lp+1;
    }
};
// @lc code=end

// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem283.h"

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=283 lang=cpp
 *
 * [283] 移动零
 */

// @lc code=start
class Solution {
public:
//利用27题移除元素的method
//先移除所有的0,
//再追加0
    void moveZeroes(vector<int>& nums) {
        //返回值正好是追加0的第一个位置,顺着这个索引追加往后即可
        int zCount = removeElement(nums,0);
        while(zCount < nums.size()){
            nums[zCount++] = 0; 
        }

        
    }

    int removeElement(vector<int>& nums, int val) {

   
    int lp = 0;
    int rp = 0;
    while(rp < nums.size()){
        if(nums[rp] != val ){
            nums[lp] = nums[rp];
            lp++;
            }
        rp++;
    }
    //这里返回的是下一个空位(可以理解为数组大小,而不是end索引)
    return lp;
    }
};
// @lc code=end


 *
 * [283] 移动零
 */

// @lc code=start
class Solution {
public:
//利用27题思路,但仅交换
    void moveZeroes(vector<int>& nums) {
        int lp = 0;
        int rp = 0;
        while(rp < nums.size()){
            if(nums[rp] != 0){
                // nums[lp] = nums[rp];
                //同27题相比修改了此行
                swap(nums[lp],nums[rp]);
                lp++;
            }
            rp++;
        }  
    }
  
};
*
 * @lc app=leetcode.cn id=844 lang=cpp
 *
 * [844] 比较含退格的字符串
 */

// @lc code=start
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        // scanString(s);、
        //idea:重构string,依次对s,t进行扫描。比对重构后的string
        //法1:用栈扫描重构法
        return buldingString(s) == buldingString(t);

        // return false;
    }

    string buldingString(string s){
        string str;
        for(char ch : s){
            if(ch != '#'){
                str.push_back(ch);
                //pop判空
            }else if(!str.empty()){
                str.pop_back();
            }
        }
        return str;
    }
// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem844.h"

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=844 lang=cpp
 *
 * [844] 比较含退格的字符串
 */

// @lc code=start
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        // scanString(s);、
        //idea:重构string,依次对s,t进行扫描。比对重构后的string
        //法2:用双指针扫描重构法
     
        return !scanString(s).compare(scanString(t));

        // return false;
    }
    
    string scanString(string arr){
        string str = arr;
        int lp = 0;
        int rp = 0;
        while(rp < str.length()){
            if(str.at(rp) != '#'){
                str[lp] = str[rp];
                lp++;
            }else{
                lp--;
            }
            rp++; 
            //过多回退符导致回退到负索引 
            if(lp < 0){
                lp = 0;
             }
        }
        //返回切割后的string
        return str.substr(0,lp);
    }
    
};
// @lc code=end

出现溢出

// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem977.h"

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=977 lang=cpp
 *
 * [977] 有序数组的平方
 */

// @lc code=start
#include<queue>
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       //test case 有序,且可能含负数
       //若含负数则平方后存在两组有序序列
       //对此两组有序序列进行归并排序即可
        vector<int> ans;
       //1.若含负数
       //找到最后一个负数的index
       int i;
        for(int j = 0; j < nums.size(); j++){
            if(nums[i] < 0){
                i++;
            }
       }
       //i必指向非负,
       //如含负,则i-1必指向最后一个负
        int negative = i - 1;
        while(negative >= 0 || i < nums.size()){
            //正数到头了
            if(i == nums.size()){
                ans.push_back(nums[negative] * nums[negative]);
                negative--;
                //负数到头了
            }else if(negative < 0){
                ans.push_back(nums[i] * nums[i]);
                i++;
                //负平方>正平方
            }else if(nums[negative] * nums[negative] < nums[i] * nums[i]){
                 ans.push_back(nums[negative] * nums[negative]);
                negative--;
                //正平方>负平方
            }else{
                 ans.push_back(nums[i] * nums[i]);
                i++;
            }
        }
        return ans;
        
    }
};
// @lc code=end


标签:rp,lc,nums,--,leetcode,int,lp,篇刷题,string
From: https://www.cnblogs.com/MR---Zhao/p/18027968

相关文章

  • 2.23测试
    T1:绑腿跑题目描述HZOI有N个小盆友,每天他们都会按同样的站位顺序进行各项体育活动。一天,HZOI的首领决定组织一个“绑腿跑”的比赛。为了安全起见,首领会从他们当前的队列中选出一个连续的区间来进行这个比赛。但是,众所周知,如果参加比赛的小盆友要玩得开心,而且安全的话,那么参......
  • 内存和磁盘的亲密关系
    程序保存在存储设备中,通过有序的被读出来实现运行,这一机制称为存储程序方式(程序内置方式)。计算机中主要的存储部件是内存和磁盘。磁盘中存储的程序,必须要加载到内存后才能运行。磁盘中保存的原始程序是无法直接运行的。这是因为,负责解析和运行程序内容的CPU,需要通过内部程序计数器......
  • 面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
    写在开头面试官:“我们在Java的集合和数据结构中都离不开比较器,请你聊一聊Comparable和Comparator这两种的区别吧”内心活动:“上来就这么直接吗,那些ArrayList,HashMap都不问呀,好,既然如此,那让我来征服你吧,面试官大人!”我:“好滴!巴拉巴拉~”ComparableComparable是java.lang包......
  • 盘点一个Python自动化办公Excel数据处理的需求
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【干锅牛蛙】问了一个Python处理Excel数据的问题。问题如下:有两个问题哈:1、表头有合并单元格识别不出来,如何处理类似下图2、遇到单元格有公式自动识别成了0,如何处理,保留计算后的值,类似下图附上他自己的代码如下:目......
  • 第7章 程序在何种环境中运行的 笔记
    硬件环境是程序运行的基础。它包括处理器、内存、硬盘、显示器等硬件设备。这些设备为程序的运行提供了基本的物理支持。例如,处理器负责执行程序的指令,内存则负责存储程序的数据。没有这些硬件设备,程序就无法运行。操作系统环境是程序运行的平台。操作系统是一种特殊的软件,它管理......
  • 第4章 控制方法 笔记
    控制方法是一种特殊的系统方法,它强调通过调节系统的行为和性能来达到预期的目标。这种方法的核心是反馈机制,即通过收集系统的输出信息,并将其与预期目标进行比较,然后根据差异来调整系统的输入,从而实现系统的稳定和优化。在阅读过程中,我深入了解了控制方法的具体步骤和技巧。这些包......
  • 从源文件到可执行文件
    CPU能解释和执行的程序叫本机代码(机器语言代码)。将多个目标文件拼接成一个EXE文件的工具是链接机。扩展名.obj的目标文件的内容是本机代码。由多个目标文件打包而成的文件叫库文件,包含DLL文件中的函数调用信息的文件叫导入库。程序运行时动态分配的内存空间叫堆。对源代码进行编......
  • [陇剑杯 2021]webshell
    追踪流进行解题第一题:黑客登录系统使用的密码是Admin123!@#在第6个流的时候可以发现login的页面和有相关的信息,复制进行解码得到结果或者在搜索栏里用POST规则搜索,因为密码登录的规则一般是POST方式  第二题:黑客修改了一个日志文件,文件的绝对路径为/var/www/html/data......
  • markdown学习
    Markdown学习二级标题三级标题四级标题字体hellowordhellowordhellowordhelloword引用选择狂神分割线图片超链接[点击跳转哔哩哔哩][https://www.bilibili.com/video/BV12J41137hu/?p=6&spm_id_from=pageDriver&vd_source=93e3a3e5b46479942c347265d2421476]......
  • Kubernetes配合Jenkins实现轻量自动持续集成
    Kubernetes配合Jenkins实现轻量自动持续集成原创 王先森sec 王先森Sec 2024-02-1913:16 北京 听全文这是一个分享运维,DevOps,安全等知识的微信公众号。王先森Sec王先森Sec分享运维,DevOps,安全等知识。23篇原创内容公众号背景介绍在当今的软件开......