关于javascript:持续更新算法10字符串String篇

前言

1.本文章以学习记录为目标,如果文章中存在问题请及时指出。原文链接:面试助力:算法101:JavaScript形容

2.学会本章节内容可能让你对原理的把握更上一层,也能让编码能力更上一层

3.在本文中我会简略形容我的思考,拿到每一道题的时候(以现有的能力)做出怎么的剖析。

4.本文中会以我的思考后果而尝试实现,而最终的解决方案会贴在文章开端。

part1:翻转整数

心路历程:

1.了解题意:整数、32位、有符号、反转每位数字
2.看懂示例:以上三个示例别离形容了反转、保留符号、去零(如果最高位为0则只保留其余字符)。
3.留神:形容了取值范畴,超出范围则返回0

尝试:

1.第一步:判断

是否为整数?是否超出长度范畴?是否蕴含符号位?

2.第二步:翻转
3.第三步:解决

是否最高位为0?是否须要拼接符号位?

代码如下:

/**
 * @description: 翻转整数
 * @params {number} str - 传入的整数
 * @return {number} 翻转后的整数
 */
function reverse(str) {
     let symbol = ""
     if (typeof str === "number" && Number.isInteger(str)) {
        if (str.toString().length > 32 !== true) {
            if (str.toString()[0] === "-") {
                symbol = str.toString()[0]
            } 
            // 翻转和解决
            let numArr, newStr
            if (symbol) {
                numArr = [].slice.call(str.toString().slice(1)).reverse()
            } else {
                numArr = [].slice.call(str.toString()).reverse()
            } 
            newStr = numArr.join("")
            for (let i = 0; i < newStr.length; i++) {
                if (newStr[i] === "0") {
                    newStr = newStr.slice(i + 1)
                } 
                i++
            }
            return parseInt(symbol + newStr)
        } else {
            return new Error("长度超出限度")
        } 
    } else {
        return new Error("非整数")
    }
}
console.log(reverse(123)) // 321
console.log(reverse(-123)) // -321
console.log(reverse(120)) // 21

能够看到,依照我剖析的思路,以及我当初可能纯熟应用的一些办法,未然是自以为是的将它实现了。接下来看看最终答案是什么吧。

终极解决方案————精髓来袭:


代码如下:

/**
 * @param {number} x
 * @return {number}
 */
const reverse = (x) => {
  // 非空判断
  if (typeof x !== 'number') {
    return;
  }
  // 极值
  const MAX = 2147483647;
  const MIN = -2147483648;

  // 辨认数字残余局部并翻转
  const rest =
    x > 0
      ? String(x)
        .split('')
        .reverse()
        .join('')
      : String(x)
        .slice(1)
        .split('')
        .reverse()
        .join('');

  // 转换为正常值,辨别正负数
  const result = x > 0 ? parseInt(rest, 10) : 0 - parseInt(rest, 10);

  // 边界状况
  if (result >= MIN && result <= MAX) {
    return result;
  }
  return 0;
};

剖析:
1.思路上:与我的思路基本一致
2.代码上:比我的简洁有数倍,应用的办法也更加精确
3.存在的问题:(1)我的代码首先做了判断整数的解决,但没有判断是否为空的状况;(2)极值的判断全面又粗率,题中给出的是数值的取值范畴,而我的判断是字符长度,也是显著的答非所问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理