每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day30

tags: ItIron2021 Javascript

前言

终於最後一天啦,实际上写了几篇之後我就发现这主题没有我想像中的好发挥,实际在模拟面试的活动中我可以针对同学的回答进行补充或是追问,也可以比较清楚知道我需要再多讲解哪些部份的概念,不过当转换成单向的文字时就没有这麽自由了,许多篇文章现在回头看起来都觉得讲得过浅,有很大的进步空间,之後如果要做这样的活动纪录我会再想其他办法的!
现在就让我们来看最後一题吧!

本日题目与解释

请写一个简单的函数检测输入的字串是否为回文(palindrome)

最後一张的防雷图!

thinking-day30

有在刷leetcode的朋友对这题目一定不陌生,我记得它甚至分成4个题目让你挑战,总之经过前面的锻链,我想你知道你需要先厘清问题!你可能会追问以下的问题

  • 什麽是回文?
  • 这函数只要回传一个Boolean即可吗?
  • 如果遇到空格或特殊符号要怎麽处理?
  • 大小写需要判别吗?

很好、很全面的追问,因此面试官替你进一步说明了题目。

所谓回文是指该字串从头到尾、从尾到头都是相同的文字排序,在这次的情境中,请你忽略大小写以及特殊文字(也就是除了a-z、数字以及_之外的字元),最终回传一个Boolean判断传入的字串是否为回文

举几个例子来看

isPalindrome('I am a dog') // false 正反排序不相同
isPalindrome('I am a i') // true 不管大小写、空格被忽略,正反都是iamai
isPalindrome('I @@am a i@') // true 特殊字元也被忽略,同上
isPalindrome('') // true

了解之後我们就可以开始动手了,很明显我们需要采取几个步骤

  1. 将输入的字串转为大写或小写
  2. 排除掉不需要考虑的特殊字元
  3. 测试该字串是否反过来与原本相同

我们一步步来吧! 第一步我们就不说明了,先转为大小写这很容易

  • 将输入的字串转为大写或小写
str = str.toLowerCase()
  • 先排除掉不需要考虑的特殊字元

这应该是这几个步骤中比较困难的一个,但很多时候你在遇到这样的题目时,你的程序码不一定要会动,关键其实在於你能不能清楚的表达你的解题思路,排除掉特殊字元的方法有很多,最土法炼钢的自然是自己定义後再利用回圈排除罗!

const validElements = 'abcdefghijklmnopqrstuvwxyz0123456789_'.split("")
const filteredStr = str.split("").filter(item => validElements.includes(item)).join("")

当然,你也可以用正规表达式,题目具体到不用正规表达式都有些奇怪了?

str = str.replace(/\W/g, '').toLowerCase();
  • 测试该字串是否反过来与原本相同

最後一个步骤你可以选用回圈比较头尾是不是都相同,一旦不相同就回传false,是个好办法!

function isPalindrome(str) {
  str = str.toLowerCase()
  const validElements = 'abcdefghijklmnopqrstuvwxyz0123456789_'.split("")
  const filteredStr = str.split("").filter(item => validElements.includes(item)).join("")
  // 加入这边
  for (let i = 0; i < Math.floor(filteredStr.length / 2); i++) {
    if (filteredStr[i] !== filteredStr[filteredStr.length - i -1]) {
      return false
    }
  }
  return true
}

或是善用原本Array.reverse()方法,配合之前说的正规表达式就会是这样

function isPalindrome(str) {
  str = str.replace(/\W/g, '').toLowerCase();
  return (str == str.split('').reverse().join(''));
}

本日核心观念与总结

核心观念

palindrome、正规表达式

总结

  • 了解在面对这类问题时,你的程序码不一定要会动,只要能阐述你解题的逻辑即可

本文章同步发布於个人部落格,有兴趣的朋友也可以来逛逛~!


<<:  30天学习笔记 -day 30 -感言

>>:  D35 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股申购功能扩充 - 日历 }

Day7 配对条件范例 (角色,人数上限)

今天我们要自己假订一个配对情境,来做一个比官方稍微复杂一点点的 Demo,并且透过这个模拟情境的实践...

Day 7 在 Linode 上购置一台 VPS 主机并安装 Docker

Linode 是提供多样化、不同规格的 VPS 服务器提供商。你可以藉由一个 Linode 帐号管理...

Day16-sklearn(1)正规化StandardScaler、MinMaxScaler、MaxAbsScaler

正规化 缩小资料的呈现比例 可使数值呈现在一定的范围内 使我们在训练模型时,增加梯度下降的容易度并提...

Istio是什么?Istio如何编译

Istio 是当前最流行的服务网格实现 ,它是在 Kubernetes 的基础上开发的,它跟 Kub...

Day 1 转职之路

这不是第一次 我是阿姜,今年三月开始在五倍红宝石 Astro Camp 学习程序相关技能,期间接触了...