乐趣区

关于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)极值的判断全面又粗率,题中给出的是数值的取值范畴,而我的判断是字符长度,也是显著的答非所问。

退出移动版