Javascript算法——双指针法移除元素、数组去重、比较含退格字符、有序数组平方

数组移除元素(保证数组仍连续

暴力求解法(两层for循环),length单词拼写错误❌二次嵌套for的length设置

/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let length=nums.length;for(i=0;i<length;i++){const currVal=nums[i];if(currVal===val){for(k=i;k<length-1;k++){nums[k]=nums[k+1]}i--;//往前移了一个,有要从此位置开始遍历检测length--; }}return length;
};

双指针法(一层for循环)

没碰到要删除的值一样快,碰上要删除的值”慢指针就落后(不++)“

return位置❌ ,核心基础

/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let slow=0;for(fast=0;fast<nums.length;fast++){if(nums[fast]!==val){nums[slow++]=nums[fast];}}return slow;
};

数组去重

function removeDuplicatesWithTwoPointers(arr) {  // 首先对数组进行排序(如果数组未排序)  arr.sort((a, b) => a - b);  // 初始化两个指针(索引)  let left = 0;  // 遍历数组,从第二个元素开始(索引1)  for (let right = 1; right < arr.length; right++) {  // 如果当前元素与左指针指向的元素不同,则将其保留在数组中  // 并移动左指针到该位置  if (arr[right] !== arr[left]) {  //先移动指针,后替换值left++;  // 可选:如果你想要在原地修改数组,可以使用splice来替换元素  // arr.splice(left, 0, arr[right]); // 这行代码实际上是不必要的,因为我们可以直接赋值  arr[left] = arr[right]; // 直接赋值即可,因为我们已经移动了left指针  }  // 如果相同,则忽略当前元素(右指针继续移动)  }  // 截断数组,只保留去重后的部分  arr.length = left + 1;  return arr;  
}  // 示例  
const originalArray = [4, 4, 2, 5, 1, 2, 3, 3];  
const uniqueArray = removeDuplicatesWithTwoPointers(originalArray);  
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]
------------------------------------------------------------------
/*** @param {number[]} nums* @return {number}*/
var removeDuplicates = function(nums) {let pre=0;for(i=1;i<nums.length;i++){if(nums[pre]!==nums[i]){pre++;nums[pre]=nums[i];}}return pre+1;
};

移动零

在移除元素的基础上加了一个zeroIndex而已

/*** @param {number[]} nums* @return {void} Do not return anything, modify nums in-place instead.*/
var moveZeroes = function(nums) {let zeroCounts=0;let currentIndex=0;for(let i=0;i<nums.length;i++){if(nums[i]!=0){nums[currentIndex]=nums[i];currentIndex++}else{zeroCounts++;}}for(j=0;j<zeroCounts;j++){nums[currentIndex+j]=0;}return nums;
};

比较含退格的字符串

使用栈的思路

  1. 定义函数
    首先,你需要定义一个函数,比如叫 backspaceCompare,它接收两个字符串 s 和 t 作为参数。

  2. 处理字符串
    对于每个字符串(s 和 t),你需要编写一个辅助函数(比如叫 processString)来模拟退格字符的行为。这个函数将遍历字符串,并使用一个栈(或数组,因为在这里栈的功能可以通过数组轻松模拟)来存储非退格字符。

    遍历完成后,栈中剩余的字符就是模拟退格字符后的字符串。

    • 遍历字符串时,如果当前字符不是 #,则将其压入栈中。
    • 如果当前字符是 #,则从栈中弹出一个字符(如果栈不为空)。
  3. 比较结果
    使用上述辅助函数分别处理 s 和 t,得到两个处理后的字符串。然后,比较这两个字符串是否相等。

  4. 返回结果
    根据比较的结果,返回 true 或 false

/*** @param {string} s* @param {string} t* @return {boolean}*/
var backspaceCompare = function(s, t) {let sArr=process(s);let tArr=process(t);return sArr.toString()===tArr.toString()
};
function process(str){let arr=[];for(let i=0;i<str.length;i++){if(arr[i]!=='#'){arr.push(arr[i]);}else{arr.pop();}}return arr;
}

双向指针

/*** @param {string} s* @param {string} t* @return {boolean}*/
var backspaceCompare = function(s, t) {//#数量let sSkipNum=0;let tSkipNum=0;let i=s.length-1;let j=t.length-1;while(true){while(i>=0){if(s[i]==="#"){sSkipNum++;i--;}else{//有#号抵消一个数,移动指针[key]if(sSkipNum>0){sSkipNum--;i--;}else{break;}}}while(j>=0){if(t[j]==="#"){tSkipNum++;j--;}else{if(tSkipNum>0){tSkipNum--;j--;}else{break;} }}//有一方处理完就退出if(i<0||j<0)break;//字符不同if(s[i]!==t[j]){return false;}//移动指针,继续比较i--;j--;}if(i==-1&&j==-1){//同时处理完,且字符已经相等了return true;}else{return false;}
};

有序数组平方

定义左右指针和一个索引(从大递减),比较两个数的平方,移动指针更新索引 

function sortedSquares(nums) {  const n = nums.length;  const result = new Array(n); // 创建一个与输入数组相同大小的结果数组  let left = 0; // 左指针  let right = n - 1; // 右指针  let index = n - 1; // 结果数组的索引,从后往前填充  while (left <= right) {  const leftSquare = nums[left] * nums[left];  const rightSquare = nums[right] * nums[right];  if (leftSquare > rightSquare) {  result[index] = leftSquare;  left++;  } else {  result[index] = rightSquare;  right--;  }  index--;  }  return result;  
}  // 示例用法  
const nums = [-4, -1, 0, 3, 10];  
const squaredNums = sortedSquares(nums);  
console.log(squaredNums); // 输出: [0, 1, 9, 16, 100]

在JavaScript算法中,双向指针(也称为双指针或对指针)技术是一种常用的技巧,特别适用于处理需要同时从数组或字符串的两端或中间向某个方向移动指针的问题。这种方法通常能够减少空间复杂度,并且有时也能降低时间复杂度。以下是一些常见的应用场景:

  1. 数组或字符串中的两数之和
    • 给定一个已排序的数组(或字符串)和一个目标和,使用双向指针从两端向中间遍历,找到两个数(或字符)使它们的和等于目标和。这种方法的时间复杂度为O(n)。
  2. 回文检测
    • 判断一个字符串是否是回文。可以使用两个指针,一个从字符串的开头开始,另一个从字符串的末尾开始,然后向中间移动,比较对应位置的字符是否相同。
  3. 容器中的水量
    • 给定n个非负整数表示每个柱子的高度,计算在这些柱子之间能够接到的雨水总量。这个问题可以通过使用双向指针和栈来解决。
  4. 合并两个有序数组
    • 将两个有序数组合并成一个有序数组。可以使用两个指针分别指向两个数组的开头,然后比较当前指针所指的元素,将较小的元素添加到结果数组中,并移动相应的指针。
  5. 最长公共子序列(LCS)
    • 虽然通常使用动态规划来解决LCS问题,但双向指针也可以用于一些特定形式的LCS问题,特别是在与字符串匹配相关的问题中。
  6. 滑动窗口
    • 双向指针技术可以与滑动窗口技术结合使用,以解决一些需要维护一个固定大小的窗口并计算窗口内元素的问题。
  7. 移除元素使数组有序
    • 给定一个数组,其中每个元素都是某个范围内的整数。要求移除尽可能少的元素,使得剩余的元素按非递减顺序排列。这个问题可以通过使用双向指针和贪心策略来解决。
  8. 链表中的两数相加
    • 给定两个表示非负整数的链表,每个节点包含一个数字。这些数字以逆序的方式存储,并且每个节点只能存储一个数字。将这两个数相加并以链表的形式返回它们的和。这个问题可以通过使用双向指针(或更准确地说是两个游标)来遍历两个链表并构建结果链表。

请注意,双向指针的应用场景不仅限于上述例子,它可以根据问题的具体需求进行灵活应用。在解决问题时,重要的是要识别出是否可以通过同时从两个方向遍历数据来简化问题或提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、账号密码存储

使用Playfers存储 Unity本地持久化类Playerprefs使用详解 - PlaneZhong - 博客园 (cnblogs.com) 一、登陆界面切换 1、登陆界面的脚本&#xff08;机制类脚本&#xff09; 在这个UI上挂载一个脚本LoginWnd 先声明一下这个脚本&#xff0c;拖拽 2、在登录模块中调用 这里的l…

手写Spring IOC-简易版

目录 项目结构entitydaoIUserDaoUserDaoImpl serviceIUserServiceUserServiceImpl ApplicationContext 配置文件初始化 IOC 容器RunApplication 注解初始化 IOC 容器BeanAutowired Reference 项目结构 entity User Data NoArgsConstructor AllArgsConstructor Accessors(chai…

神经网络中使用的激活函数有什么用?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; &#x1f50d;【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&am…

最新仿蓝奏网盘系统源码 附教程

自带的蓝奏云解析&#xff0c;是之前的代码&#xff0c;截至发帖时间&#xff0c;亲测依旧有效&#xff0c;可以扒拉下来做蓝奏云解析接口。 使用方法&#xff1a;可以将文件上传至蓝奏云&#xff0c;然后通过此套系统&#xff0c;二次解析下载&#xff0c;不会暴露你的真实蓝…

PCL 点云配准-4PCS算法(粗配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 加载点云数据 2.1.2 执行4PCS粗配准 2.1.3 可视化源点云、目标点云和配准结果 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 PCL点云算法汇总及实战案例汇总的目录地址链接…

扫雷(C 语言)

目录 一、游戏设计分析二、各个步骤的代码实现1. 游戏菜单界面的实现2. 游戏初始化3. 开始扫雷 三、完整代码四、总结 一、游戏设计分析 本次设计的扫雷游戏是展示一个 9 * 9 的棋盘&#xff0c;然后输入坐标进行判断&#xff0c;若是雷&#xff0c;则游戏结束&#xff0c;否则…

FPGA实现PCIE采集电脑端视频转SFP光口UDP输出,基于XDMA+GTX架构,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案1G/2.5G Ethernet Subsystem实现物理层方案1G/2.5G Ethernet PCS/PMA or SGMII Tri Mode Ethernet MAC实现物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机X…

VSCODE c++不能自动补全的问题

最近安装了vscode&#xff0c;配置了C/C扩展&#xff0c;也按照网上说的配置了头文件路径 我发现有部分头文件是没办法解析的&#xff0c;只要包含这些头文件中的一个或者多个&#xff0c;就没有代码高亮和代码自动补全了&#xff0c;确定路径配置是没问题的&#xff0c;因为鼠…

【GT240X】【3】Wmware17和Centos 8 安装

文章目录 一、说明二、安装WMware2.1 下载WMware2.2 安装2.3 虚拟机的逻辑结构 三、安装Centos3.1 获取最新版本Centos3.2 创建虚拟机 四、问题和简答4.1 centos被淘汰了吗&#xff1f;4.2 centos里面中文显示成小方块的解决方法4.3 汉语-英语输入切换4.4 全屏和半屏切换 五、练…

【图论】(一)图论理论基础与岛屿问题

图论理论基础与岛屿问题 图论理论基础深度搜索&#xff08;dfs&#xff09;广度搜索&#xff08;bfs&#xff09;岛屿问题概述 岛屿数量岛屿数量-深搜版岛屿数量-广搜版 岛屿的最大面积孤岛的总面积沉没孤岛建造最大人工岛水流问题岛屿的周长 图论理论基础 这里仅对图论相关核…

精英高匿ip的自述

大家好&#xff0c;我是精英高匿IP。在网络世界里&#xff0c;我有着自己独特的看家本领&#xff0c;今天我就让大家见识一下我的本事。 我是一个神秘的网络侠客&#xff0c;我在数据的江湖中穿梭自如且不留痕迹。大家可能好奇我为什么叫精英高匿IP。“精英”代表着我拥有卓越…

【命令操作】Linux上通过mdadm配置软RAID _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【功能介绍】麒麟2403支持配置任务栏上的图标“从不合并”啦&#xff01; Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在Linux系统上使用mdadm工具配置软件RAID&#xff08;Redundant Array of Independent Disks&#xff0c;独立磁…

高频面试手撕

手撕高频结构 前言&#xff0c;以下内容&#xff0c;都是博主在秋招面试中&#xff0c;遇到的面试手撕代码题目&#xff0c;包含常见的数据结构、多线程以及数据库连接池等。 ArrayList 实现了ArrayList的基本功能&#xff0c;包括随机访问和自动扩容。 添加元素时&#xff…

施磊C++ | 进阶学习笔记 | 1.对象的应用优化、右值引用的优化

一.对象的应用优化、右值引用的优化 文章目录 一.对象的应用优化、右值引用的优化1.1 构造&#xff0c;拷贝&#xff0c;赋值&#xff0c;析构中的优化课后练习&#xff1a; 1.2 函数调用过程中对象背后调用的方法1.3 对象优化三原则1.4 右值引用、move移动语意、完美转发 1.1 …

ThingsBoard规则链节点:Clear Alarm节点详解

引言 Clear Alarm 节点含义 使用场景 实际项目中的运用场景 智能建筑管理系统 工业生产线监控 远程医疗监护 结论 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;它提供了设备管理、数据收集、处理和可视化等功能。在 ThingsBoard 中&#xff0c;规则链&#xff…

QExcel 保存数据 (QtXlsxWriter库 编译)

QtXlsxWriter 是一个用于在 Qt 应用程序中创建和操作 Excel XLSX 文件的库。它提供了一个简单的 API&#xff0c;使开发者能够轻松地生成和修改 Excel 文件&#xff0c;而无需依赖 Microsoft Excel 或其他外部应用程序。支持初始化、写文件、读文件、格式设置、合并单元格、加粗…

scala 高阶函数 (下)

一.fold fold的作用 idea实例 二.sorted函数 sort基础知识 idea实例 三.sortWith sortWith基础知识 idea实例

音乐播放器项目专栏介绍​

1.简介 本专栏使用Qt QWidget作为显示界面&#xff0c;你将会学习到以下内容&#xff1a; 1.大量ui美化的实例。 2.各种复杂ui布局。 3.常见显示效果实现。 4.大量QSS实例。 5.Qt音频播放&#xff0c;音乐歌词文件加载&#xff0c;展示。 6.播放器界面换肤。 相信学习了本专栏…

Java学习-JUC

目录 1. 简介 2. Atomic包 2.1 什么是原子类 2.2 Atomic包里的类 3. CAS 3.1 CAS是什么 3.2 Java中对CAS的实现 3.3 CAS的缺陷 4. JUC里面的常见锁 4.1 锁分类 4.1.1 按上锁方式划分 4.1.2 按特性划分 4.1.3 其他锁 4.2 Synchronized和JUC的锁对比 5. 锁原理分析…

智慧园区能带来哪些便利?

所谓智慧园区&#xff0c;是指通过信息化手段&#xff0c;实现园区内各项业务的数字化和智能化管理。园区管理者可以利用智能化平台实时监控各项运营情况&#xff0c;如能源使用、安全监控和物流运输等&#xff0c;及时调整管理策略&#xff0c;提高运营效率。智慧园区利用大数…