C语言基础双指针移除元素解法

本题方法:双指针。知识比较基础,思路简单

题目:

我的题解:

int removeElement(int* nums, int numsSize, int val)
{
    int i=0,j=0;
    int cnt=0;                 //计数器,用来统计val的个数
    while(j<numsSize)
    {
        if(nums[j]!=val)       //1
        {
            nums[i]=nums[j];
            i++;
            j++;
        }
        else                  //2
        {
            j++;
            cnt++;
        }
    }
    return numsSize-cnt;      //3
}

关于我的解法思路:

我们先举个例子,比如{2,5,7,9,9,1,0}val=9

刚开始我们让指针都指向0位置,也就是nums[0],j为快指针,i为慢指针

如果j指向的地方不是val(也就是9),那我们就直接让nums[j]覆盖nums[i],并且i++,j++,让两个指针都指向下一个位置,如下图:

如此重复,指向7也是同理

指向7这个元素后,i++,j++,这时候,两个指针都到了val(也就是9)这个地方

j指针 指向的就是我们要去掉的值val(9),也就是代码中的 2步骤,这时候我们 i指针不动,j指针继续往前走,cnt变量记录val出现的次数,cnt++。

j到了第二个9的时候 ,j指针还是继续往前走i指针还是不变,cnt依旧++,如下图

这时候,j指针指向的是1,就不是val的值了,我们就直接把nums[j]覆盖nums[i],也就是把1覆盖9了,那就两个指针都往前走,同理j指向0,不是val,那就继续覆盖。

返回值:就是数组总个数numsSize减去val出现的次数cnt。

双指针大致思路如上,有意见欢迎指出~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言指针用法总结

    1.先谈谈内存与地址 引例: 计算机的内存看成大街上的一排房屋,每个房屋都要有门牌号,这个就相当于计算机的内存地址,而房屋里面住的人.家具等等就相当于需要存放的各种各样的数据,所以要想访问这些数据就得知道它的内存地址. **bit:计算机的内存便是由数以亿万计的位(bit)**组成,每个位的容纳值为0或1. byte:字节,一个字节包含8个位(bit),可以储存无符号unsigned类型的值为0-255(28-1),储存有符号signed类型的值为-128到127.无符号类型就是非负数,而有符号

  • C语言结构体指针引用详解

    目录 指向结构体变量的指针 指向结构体数组的指针 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过"结构体变量名.成员名"的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址.如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员. 那么,这个指针变量定义成

  • C语言之初识指针

    指针是什么? 那到底什么是指针呢,其实指针和之前学习的变量基本相似,不过变量里面放的是一些值,而指针里面放的是它所指的地方的地址.在声明一个变量是,计算机就会为该变量预留一个位置,而指针所指☞的就是那个位置. 举个例子: int a = 10;//设置一个变量a的值为10 int *p = &a;//p这个指针里面就放的是a的地址 而&这个符号,就是取地址符,就像我们在使用scanf函数时  scanf("%d",&a); 这个a前面的&是一个意思,就是

  • C语言指针的图文详解

    目录 指针是什么? 指针和指针变量 1. 指针类型决定了指针进行解引用操作的时候,能访问空间的大小 2. 指针加减整数 野指针 野指针的成因 指针和数组 二级指针 指针数组.数组指针 总结 指针是什么? 指针(Pointer)是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 换句话说就是可以通过指针找到以它为地址的内存单元. 理解:内存图解. 指针是个变量,存放内存单元的地址(编号). int main(){ int a = 10;//在内存中开辟空间存储 int* p = &a;

  • c语言的指针数组详解

    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p; p = &arr[0];//此句也可以写成 p = arr: for(int i=0;i<3;i++) { printf("第%d个元素值为:%d\n",i,*(p+i)); /*应注意这里指针的定义类型:p+i并不是指p的地址+1, 而是偏移一个类型的字节数,这里的类型是int,所以偏移4个字节*

  • C语言基础双指针移除元素解法

    本题方法:双指针.知识比较基础,思路简单 题目: 我的题解: int removeElement(int* nums, int numsSize, int val) { int i=0,j=0; int cnt=0; //计数器,用来统计val的个数 while(j<numsSize) { if(nums[j]!=val) //1 { nums[i]=nums[j]; i++; j++; } else //2 { j++; cnt++; } } return numsSize-cnt; //3

  • C语言移除元素的三种思路讲解

    目录 问题描述 解题方案 思路一 思路二 思路三(最优解) 问题描述 原题链接:https://leetcode.cn/problems/remove-element/ 解题方案 思路一 思路一: 首先通过简单分析,很明显这是一道顺序表相关问题.首先能够想到的是暴力求解,即思路一:找到所有的val,每次挪动val后的数据覆盖删除val. 代码展示: int find(int*nums,int numsSize,int val) { int i=0; for(i=0;i<numsSize;i++)

  • 详解C语言中双指针算法的使用

    目录 前言 一.最长不含重复字符的子字符串 1.题目要求 2.个人题解 二.和为S的两个数字 1.题目要求 2.个人题解 前言 双指针算法 算法思想 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的. 换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算. 今天带大家来学习算法中双指针的应用场景. 一.最长不含重复字符的子字符串 1.题目要求 2.个人题解 2.1

  • js基础之DOM中元素对象的属性方法详解

    在 HTML DOM (文档对象模型)中,每个部分都是节点. 节点是DOM结构中最基本的组成单元,每一个HTML标签都是DOM结构的节点. 文档是一个    文档节点 . 所有的HTML元素都是    元素节点 所有 HTML 属性都是    属性节点 文本插入到 HTML 元素是    文本节点 注释是    注释节点. 最基本的节点类型是Node类型,其他所有类型都继承自Node,DOM操作往往是js中开销最大的部分,因而NodeList导致的问题最多.要注意:NodeList是'动态的',

  • Go语言基础学习教程

    本文实例讲述了Go语言基础知识.分享给大家供大家参考,具体如下: GO文件目录结构 该图是go-windows的目录结构 如图,go的程序应该是在gopath文件夹下的,分为bin, pkg, 和src三个子文件夹 src文件夹:每个次级文件夹(如demo)就是代表一个go项目,里面存放源程序 bin文件夹:go的每个项目生成的二进制可执行程序.windows下会生成.exe文件,linux下会生成可执行文件.Go的最大特色之一就是可移植性,就是说,当生成一个demo.exe之后,将这个exe文

  • C#语言基础——结构体和枚举类型全面解析

    一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,其实就是一个自定义

  • R语言基础统计方法图文实例讲解

    tidyr > tdata <- data.frame(names=rownames(tdata),tdata)行名作为第一列 > gather(tdata,key="Key",value="Value",cyl:disp,mpg)创key列和value列,cyl和disp放在一列中 -号减去不需要转换的列 > spread(gdata,key="Key",value="Value") 根据value将

  • C语言基础之二分查找知识最全汇总

    一.前言 在自学二分查找的过程中我想到了一些变化问题,有的自己就慢慢理解了,有的在网上找到了答案,奈何没有找到想要的总结归纳.我就斗胆自己写了一篇,号称史上最全.希望和我一样的伙伴可以少走一点弯路. 二分查找凭借其低时间复杂度O(log(n))成为了各个蒟蒻的入门知识,但是其衍生出的各种题目相较原题目而言就没有那么容易求解,以下借用c语言实现二分查找算法及其衍生.二分查找仅适用于事先已经排好序的顺序表.其基本思路就是每次取中间数,如果中间数大于所求数就向上查找,反之向下. 二.原始二分查找 1.

  • C 语言基础实现青蛙跳台阶和汉诺塔问题

    目录 一.青蛙跳台阶 题目 思路 分析 1. 从跳法次数分析 2. 从过程分析 二.青蛙跳台阶变式1 题目 分析 三.青蛙跳台阶变式2 题目 分析 四.汉诺塔问题(求步数) 题目 思路 分析 五.汉诺塔问题(求移动过程) 题目 思路 分析 一.青蛙跳台阶 题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法 思路 遇见题目我们可以在纸上先动手画画,把最简单的几种方式列出来,作比较,找规律. 分析 按照上面表格可以从跳法次数,过程,或者两者结合找规

  • C语言基础解析之分支与循环语句

    目录 - if语句:if(表达式) 悬空else问题 - switch语句 要注意的细节 switch中的的default子句: - while循环语法结构 - for循环语法结构 - do while循环 循环练习题 - 题目一(阶乘) - 题目二(阶乘和) - 题目三(二分查找) - 题目四(两边往中间渐变) - 题目五(密码登录) - 题目六(猜数字游戏) - goto语句 - getchar与putchar用法 - if语句:if(表达式) // 括号里面放一个表达式 ​//表达式的结果

随机推荐