陪伴我们一路走来的经典题目《回文字符串》

161 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

实现一个isPalindrome函数,判断传入的字符串是否为回文字符串

const str = "_Hello, OllEh "
const result = isPalindrome(str)
console.log(result)

结果:

true

分析

  • 回文字符串是指在忽略标点符号,大小写和空格的前提下,正着读和反着读一模一样
  • 本题中的str包含了大小写,所以第一步我们应该先将其统一为小写或大写
  • 之后遍历str的时候,可以考虑用两个变量来指向头部和尾部的字母
  • 比较指向头尾字母的变量是否相等来解决本题
  • 这个解题思路可以使用算法中的双指针来解决

昨日题

题目

找出2个数组中的对称差:

const a1 = ["HTML",1,"CSS",2,"JavaScript","anyScript","NodeJs","done"]
const a2 = ["HTML",1,"CSS",2,"NodeJs","anyScript","done"]

结果:

["JavaScript"]

答案

function diffArr (arr1, arr2 ) {

	let maxLengthArr = arr1.length > arr2.length ? arr1 : arr2
	let minLengthArr = arr1.length < arr2.length ? arr1 : arr2

	let result = []

	for (let index = 0; index < maxLengthArr.length; index++) {

		if (!minLengthArr.includes(maxLengthArr[index])) {
			result.push(maxLengthArr[index])
		}

	}
	
	return result
}

解析

  • 本题的关键就在于怎么从a1中得到a2中没有的成员"JavaScript"
  • 首先我们通过判断得到传入数组中,最长的数组maxLengthArr和最短的数组minLengthArr
  • 之后对最长的数组maxLengthArr进行遍历
  • 在循环内判断当前的maxLengthArr[index]a2中是否也同样存在,幸好es6给我们提供了includes方法
  • 我们知道includes的返回结果是boolean,所以可以通过其返回值来进行判断
  • 当找到a2中不包含的元素后,我们就可以用result.push将结果保存
  • 题解这种写法其实不是很优雅,这里再提供针对for的另一种写法,采用es6的api来实现,而且不用再额外声明一个数组
return maxLengthArr.filter(item => !minLengthArr.includes(item))

结语

此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。
创作不易,少年,就请留个赞再走吧!