不折腾的前端,和咸鱼有什么区别
目录一 目录二 前言三 解题及测试四 LeetCode Submit五 解题思路六 进一步思考小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。
LeetCode 给定函数体: /** * @param {number} num * @return {string} */ var convertToBase7 = function(num) { };根据上面的已知函数,尝试破解本题吧~
确定了自己的答案再看下面代码哈~
index.js
/** * @name 七进制数 * @param {number} num * @return {string} */ const convertToBase7 = (num) => { // 如果是 0 的情况 if (num === 0) { return '0'; } let plusMinus = 1; if (num < 0) { plusMinus = -1; num = -num; } let result = ''; while (num > 0) { result = Math.floor(num % 7) + result; num = Math.floor(num / 7); } return plusMinus > 0 ? String(result) : String(-result); }; // const num = -7; const num = 100; console.log(convertToBase7(num));node index.js 返回:
202心情好的人可能每天都是 lucky day~
今天看到这题,要不是 LeetCode 早就出了,我还以为它监控我的生活!
是的,前几天刚写了下十进制和二进制的转换问题,所以直接破解:
/** * @name 七进制数 * @param {number} num * @return {string} */ const convertToBase7 = (num) => { // 如果是 0 的情况 if (num === 0) { return '0'; } let plusMinus = 1; if (num < 0) { plusMinus = -1; num = -num; } let result = ''; while (num > 0) { result = Math.floor(num % 7) + result; num = Math.floor(num / 7); } return plusMinus > 0 ? String(result) : String(-result); };然后提交:
Accepted * 241/241 cases passed (64 ms) * Your runtime beats 87.06 % of javascript submissions * Your memory usage beats 31.11 % of javascript submissions (33.8 MB)这题就这么解了。
最后说说逻辑:
我们需要明白的是,一个 10 进制的 1234,如何用 10 进制的话来表示?
1234 % 10 = 4(个位数) 123 % 10 = 3(十位数) 12 % 10 = 2(百位数) 1 % 10 = 1(千位数)下一步的被除数 = 上一步被除数 / 10
看到这里,我们应该有所体会了,那么再尝试转换为 7 进制:
1234 % 7 = 2(个位数) 176 % 7 = 1(十位数) 25 % 7 = 4(百位数) 3 % 7 = 3(千位数)下一步的被除数 = 上一步被除数 / 7
这样,小伙伴们应该清楚进制转换的一个机制了,那么下面就好讲了:
如果是 0,直接返回字符串 '0' 如果不是 0,那么先将其转换成正数,然后将其转换为 7 进制,最后根据一开始的正负,添加上符号即可。看到这里,想必小伙伴们还没过瘾,所以咱们抽取下,写完善下:
/** * @name 十进制转十六以内任意进制 * @param {number} 需要转换的数 * @param {number} 需要转换到什么进制 */ const decimalToArbitrary = (num, ascii) => { num = Math.abs(num); const hexAdecimal = '0123456789abcdef'; let result = ''; while (num > 0) { result = hexAdecimal[Math.floor(num % ascii)] + result; num = Math.floor(num / ascii); } return String(result) || '0'; } /** * @name 七进制数 * @param {number} num * @return {string} */ const convertToBase7 = (num) => { const result = decimalToArbitrary(num, 7); return num > 0 ? String(result) : String(-result); }; // const num = -7; const num = 100; console.log(convertToBase7(num));Submit 试试:
Accepted * 241/241 cases passed (60 ms) * Your runtime beats 92.94 % of javascript submissions * Your memory usage beats 17.78 % of javascript submissions (33.9 MB)完美,不仅解决了 7 进制的问题,十进制转十六以内任意进制随便用~
不折腾的前端,和咸鱼有什么区别!
jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。
浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!
扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
