Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
今天的题目为简单,进制转换在日常生活应该是很常见的,比如我们最常见的二进制,八进制,十六进制,这些的转化我们都应该需要掌握,因为这算是计算机的基础知识。
每日一题
今天的每日一题 504. 七进制数,难度为简单
- 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100
输出: "202"
示例 2:
输入: num = -7
输出: "-10"
提示:
- -107 <= num <= 107
题解
简单模拟
进制转换
做题之前,要先来了解一一下,我们在日常最经常看到的数字,基本都是十进制的,也就是满10进1,对于计算机来说,使用的是二进制,也就是满2进1,比如十进制的 3,转化为二进制就会变成 11,从右往左分别就是 2^0, 2^1, 然后相加,结果就是等于 3。
再比如我们上学时候经常听说的 十六进制 和 八进制,转化的原理上和 二进制 是完全一样的,比如现在我们有一个数字 17 转化为 十六进制 和 八进制 分别是 11 和 21,用图来看一下转化过程:
是不是和二进制完全是相同的一种方法,那么在知道了转化的原理和方法之后,我们来看一下题目要求的 七进制转换。
做题
从上面的三种转换我们能够看出来一个规律,就是除了右边的第一位,也就是 次方为0 的这一位,其他位置的数都是能够被当前进制整除的。那么 num % 7,就能够求得我们需要的 次方为0 的这一位,并且在原来的 num 上减掉这个数之后,剩下的数除以 7 然后向下取整,这时候的 次方为0 位数就是之前 次方为1 的位置。
这点我们可以用十进制来感受一下,123 就是 10^2*1 + 10^1*2 + 10^0*3 ,那么按照上面的逻辑,除以10并且向下取整之后,个位数的数就是之前的十位数。
最后,我们还需要考虑一下负数的情况,负数的进制转换就只是在正数的基础上添加一个 - 号。
/**
* @param {number} num
* @return {string}
*/
var convertToBase7 = function(num) {
if (num == 0) {
return "0";
}
let negative = num < 0;
num = Math.abs(num);
const ans = [];
while (num > 0) {
ans.push(num % 7);
num = Math.floor(num / 7);
}
if (negative) {
ans.push('-');
}
return ans.reverse().join('');
};
进阶
我们能不能将这个函数做一个转化,生成一个可以转化十进制为任何进制的函数呢?
当然是可以的,只要把答案中的 7 抽成配置,无论这项配置改成多少,最后的算法都是不变的
/**
* @param {number} num
* @return {string}
*/
var convertToBase7 = function (num) {
const BaseSystem = 7;
if (num == 0) {
return "0";
}
let negative = num < 0;
num = Math.abs(num);
const ans = [];
while (num > 0) {
ans.push(num % BaseSystem);
num = Math.floor(num / BaseSystem);
}
if (negative) {
ans.push("-");
}
return ans.reverse().join("");
};