当前位置: 首页 > news >正文

学习记录:js算法(十三):移动零、验证回文串

文章目录

    • 移动零
      • 我的思路
      • 网上思路
    • 验证回文串
      • 我的思路
      • 网上思路
    • 总结

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意: 必须在不复制数组的情况下原地对数组进行操作。

示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]示例 2:
输入: nums = [0]
输出: [0]

我的思路
万变不离其宗: 循环
网上思路
双指针

我的思路

var moveZeroes = function (nums) {let len = nums.length - 1for (let i = 0; i < len; i++) {for (let j = 0; j < len - i; j++) {if (nums[j] === 0) {nums[j] = nums[j + 1]nums[j + 1] = 0}}}
};

讲解
改变冒泡排序,这种不需要讲解了吧,唯一需要说明的是:let len = nums.length - 1,为什么要 减去1 呢?是因为在第二个循环中,j+1 会找到数组的最后一位,如果长度是 nums.length 的话,会找不到 j+1

网上思路

var moveZeroes = function (nums) {let lastNonZeroIndex = 0; // 指向下一个非零元素的位置// 遍历数组for (let i = 0; i < nums.length; i++) {if (nums[i] !== 0) {// 如果当前元素不是 0,将其放到 lastNonZeroIndex 位置nums[lastNonZeroIndex] = nums[i];lastNonZeroIndex++; // 移动指针}}// 将剩余的元素设置为 0for (let i = lastNonZeroIndex; i < nums.length; i++) {nums[i] = 0;}
};

讲解
其实很好理解

  1. 初始化一个指针 **lastNonZeroIndex:指向数组第一个元素 **
  2. 如果当前元素不是 0,将其放到 lastNonZeroIndex 指向的位置,然后 lastNonZeroIndex++,目的是: 移动指针,为下一个非零元素准备位置
  3. 这时 lastNonZeroIndex:指向下一个非零的元素

验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例

我的思路
简单,使用正则完成条件后,只需要将字符串转成数组后在翻转,然后将翻转的数组转成字符串之后,再比较。
网上思路
双指针

我的思路

var isPalindrome = function (s) {let str = s.toLowerCase().replace(/[^a-z0-9]/g, '')return str === str.split("").reverse().join("") ? true : false
};

讲解

  1. s.toLowerCase(): 将字符串转换为小写,这样在比较时就不需要考虑大小写的差异。
  2. 正则表达式中:
    • /[^a-z0-9]/g :这个正则表达式的含义是匹配所有非字母(a-z)和非数字(0-9)的字符。
    • g :这个标志表示全局匹配,即替换字符串中所有符合条件的字符。
    • ‘’ :将匹配到的字符替换为空字符串,从而移除它们。
  3. 然后字符串转数组,数组翻转后再转字符串,最后对比即可。

网上思路

var isPalindrome = function (s) {// 使用正则表达式清洗字符串const str = s.toLowerCase().replace(/[^a-z0-9]/g, '');let left = 0;let right = str.length - 1;// 使用双指针比较while (left < right) {if (str[left] !== str[right]) {return false; // 不是回文}left++;right--;}return true; // 是回文
};

讲解

  1. 使用正则将字符串转换为小写并移除所有非字母数字字符。
  2. left 从前往后,right 从后往前。
  3. while 循环 中,比较 str[left]str[right]
  4. 如果字符相等,继续移动 leftright 指针。

总结

双指针:使用两个指针,分别从数据结构的两端或某个特定位置开始移动。根据某种条件,移动一个或两个指针,直到满足特定条件或遍历完整个数据结构。没了,这两题感觉用不用双指针都一样,不像之前学习中, Map()对象使用栈 给我的印象还是深刻的,可能也是刚做双指针的题目吧,看看后续。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 考研备考是选择电子学习工具无纸化学习?还是纸质版训练考感?
  • 《javaEE篇》--线程池
  • C++ 适配器 priority_queue(优先级队列)
  • Aiseesoft Mac Video Converter Ultimate:高效多能的视频转换与编辑工具
  • 【教程】Leetcode 必知必会常用函数(C 语言版)
  • C# 时间日期运算
  • HarmonyOS NEXT 地图服务中‘我的位置’功能全解析
  • 基于机器学习的二手房房价数据分析与价格预测模型
  • 上传PDF、DOC文件到SAP HCM系统中案例
  • CSS文本样式(二)
  • Day16_Zookeeper
  • (152)时序收敛--->(02)时序收敛二
  • sql主从表的区分
  • 盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案
  • Axure设计之下拉单选框教程(中继器)
  • php的引用
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Angular6错误 Service: No provider for Renderer2
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • IDEA 插件开发入门教程
  • javascript 总结(常用工具类的封装)
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Mithril.js 入门介绍
  • rc-form之最单纯情况
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Cloud中负载均衡器概览
  • vue2.0项目引入element-ui
  • Webpack 4x 之路 ( 四 )
  • 面试总结JavaScript篇
  • 世界上最简单的无等待算法(getAndIncrement)
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序 setData 学问多
  • 用 Swift 编写面向协议的视图
  • 运行时添加log4j2的appender
  • Java数据解析之JSON
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #AngularJS#$sce.trustAsResourceUrl
  • #define 用法
  • #etcd#安装时出错
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)球球大作战
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (二)hibernate配置管理
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转载)虚函数剖析
  • .bat文件调用java类的main方法
  • .java 9 找不到符号_java找不到符号
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET C# 操作Neo4j图数据库