这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
145. 七进制数 (base-7)
标签
- 数学
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个整数,将其转化为7进制
,并以字符串形式输出。
示例 1
输入: 100
输出: "202"
示例 2
输入: -7
输出: "-10"
基本思路
首先我们得明白进制是什么, 为什么 100 的 7 进制 就是 "202"
简单来说对于任何一种进制如X进制
,就表示每一位置上的数运算时都是逢X进一位
。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一。
或者以位数拆解来看,比如十进制,逢十进一,每一位都是十
这个数位的幂次,最终加和如
1298
这个数 我们正常分析 是由
千位
是1
,表示 1 个 1000百位
是2
,表示 2 个 100十位
是9
,表示 9 个 10个位
是8
,表示 8 个 1
组成的,那么所有位数的和,就是该数字。
ok, 那么按照十进制
来看各位次其实就是,十的幂次
- 从左往右第
1
位(个位) 是8
, 表示8
个10
的0次方
=> (8 *10^0
= 8) - 从左往右第
2
位(十位) 是9
, 表示9
个10
的1次方
=> (9 *10^1
= 90) - 从左往右第
3
位(十位) 是2
, 表示2
个10
的2次方
=> (2 *10^2
= 200) - 从左往右第
4
位(十位) 是1
, 表示1
个10
的3次方
=> (1 *10^3
= 1000) ... - 从左往右第
i
位(十位) 是n
, 表示n
个10
的i-1次方
=> (1 *10^(i-1)
) - 然后求总和就是该数
那么我们再看下二进制
二进制101
转成 十进制
数是多少呢, 看他的位数
1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0
1 * 4 + 0 * 2 + 1 * 1
4 + 1 = 5
所以二进制 101
转十进制 是 5
对进制转换有概念之后我们看 七进制
,为什么 十进制100
的 七进制
就是 "202"就一目了然了
2 * 7 ^ 2 + 0 * 7 ^ 1 + 2 * 7 ^ 0
2 * 49 + 0 * 7 + 2 * 1
98 + 0 + 2 = 100
- 另外,二进制就是 从
0 - 1
由 这2
个数表示 - 那么,十进制就是 从
0 - 9
由 这10
个数表示 - 那么,十六进制就是 从
0 - 9,A - F(或a~f)
由 这16
个数表示, 其中:A~F
表示10~15
因为数位超过进制数就要进位了,这很好理解。
写法实现
let convertToBase7 = (num) => {
if (num === 0) {
return '0'
}
let res = []
// 七进制,是由 0 - 6 这 7 个数组成, 因为超过6 就要进位了
const dict = [0, 1, 2, 3, 4, 5, 6]
// 注意一个正负数问题, 保存符号位,取绝对值
let flag = num < 0 ? '-' : ''
if (flag === '-') {
num = Math.abs(num)
}
// 按各位取模计算
while(num !== 0) {
// 取出当前位数字
let temp = num % 7
res.unshift(temp)
num = parseInt(num / 7)
}
// 别忘符号位
res.unshift(flag)
// 输出结果要求是字符串
return res.join('')
}
console.log(convertToBase7(100))
146. K 进制表示下的各位数字总和 (sum-of-digits-in-base-k)
标签
- 进制
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给你一个整数 n(10 进制)和一个基数 k
,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 。
转换后,各位数字应当视作是 10 进制数字,且它们的总和也应当按 10 进制表示返回。
示例 1
输入:n = 34, k = 6
输出:9
解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。
示例 2
输入:n = 10, k = 10
输出:1
解释:n 本身就是 10 进制。 1 + 0 = 1 。
基本思路
其实这个有了上面的铺垫,思路几乎一模一样,作为练手吧
写法实现
var sumBase = function(n, k) {
let sum = 0
while(n !== 0) {
sum += n % k
n = parseInt(n / k)
}
return sum
};
let n = 34, k = 6
console.log(sumBase(n, k)) // 9
// 解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。
另外向大家着重推荐下这个系列的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 点击此处交个朋友
Or 搜索我的微信号infinity_9368
,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文
,验证消息请发给我
presious tower shock the rever monster
,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧