前端算法必刷题系列[78]|8月更文挑战

207 阅读3分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

145. 七进制数 (base-7)

标签

  • 数学
  • 简单

题目

leetcode 传送门

这里不贴题了,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, 表示 8100次方 => (8 * 10^0 = 8)
  • 从左往右第 2 位(十位) 是 9, 表示 9101次方 => (9 * 10^1 = 90)
  • 从左往右第 3 位(十位) 是 2, 表示 2102次方 => (2 * 10^2 = 200)
  • 从左往右第 4 位(十位) 是 1, 表示 1103次方 => (1 * 10^3 = 1000) ...
  • 从左往右第 i 位(十位) 是 n, 表示 n10i-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 传送门

这里不贴题了,leetcode打开就行,题目大意:

给你一个整数 n(10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和

转换后,各位数字应当视作是 10 进制数字,且它们的总和也应当按 10 进制表示返回。

示例 1

输入:n = 34, k = 6
输出:9
解释:34 (10 进制) 在 6 进制下表示为 545 + 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,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考