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