数据结构与算法之数组: Leetcode 89. 格雷编码 (Typescript版)

这篇具有很好参考价值的文章主要介绍了数据结构与算法之数组: Leetcode 89. 格雷编码 (Typescript版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

格雷编码

  • https://leetcode.cn/problems/gray-code/

描述

  • n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:
    • 每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)
    • 第一个整数是 0
    • 一个整数在序列中出现 不超过一次
    • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
    • 第一个 和 最后一个 整数的二进制表示 恰好一位不同
    • 给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

示例 1:

输入:n = 2
输出:[0,1,3,2]
解释:
[0,1,3,2] 的二进制表示是 [00,01,11,10] 。
- 00 和 01 有一位不同
- 01 和 11 有一位不同
- 11 和 10 有一位不同
- 10 和 00 有一位不同
[0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01] 。
- 00 和 10 有一位不同
- 10 和 11 有一位不同
- 11 和 01 有一位不同
- 01 和 00 有一位不同

示例 2:

输入:n = 1
输出:[0,1]

提示:

  • 1 <= n <= 16

算法实现

1 )方案 1

function grayCode(n: number): number[] {
  // 递归函数,用来算输入为n的格雷编码序列
  const recursionFn = (n: number) => {
    if (n === 1) {
      return ['0', '1']
    } else {
      const prev: string[] = recursionFn(n - 1)
      const result: string[] = []
      const max: number = Math.pow(2, n) - 1 // 最大值
      // 生成新的数组
      for (let i = 0, len = prev.length; i < len; i++) {
        result[i] = `0${prev[i]}` // 生成前i个,前一半
        result[max - i] = `1${prev[i]}` // 生成后一半,和上面是对称的(倒序)
      }
      return result
    }
  }
  return recursionFn(n).map(item => parseInt(item, 2)) // 这里二进制转十进制
}
  • 这里是基于演草纸上画出得到一个规律
  • 当n为1时
    • 二进制输出:[0,1],换成十进制输出是:[0,1]
    • 0 - 0
    • 1 - 1
    • 这里还看不出什么
  • 当n为2时
    • 二进制输出:[0,1,11,10],换成十进制就是 [0,1,3,2] 竖着看如下
    • 00 - 0
    • 01 - 1
    • 11 - 3
    • 10 - 2
    • 从上面看出,最终是偶数个总数,中间劈开一半各自对称
      • 比如:00 对应 11;01对应10
  • 当n为3时
    • 输出:[0,1,11,10,110,111,101,100],换成十进制是:[0,1,3,2,6,7,5,4],竖着排列
    • 000 - 0
    • 001 - 1
    • 011 - 3
    • 010 - 2
    • 110 - 6
    • 111 - 7
    • 101 - 5
    • 100 - 4
    • 从上述可以看到验证了上述规律
  • 这里输入的n和n-1有关,直到和最后的1有关,而1就是 [‘0’, ‘1’]的字符串
  • 这种方案属于归纳总结产生的,因为用到的是递归,容易爆栈,效率还不高

2 )方案 2文章来源地址https://www.toymoban.com/news/detail-431460.html

function grayCode(n: number): number[] {
    // 初始化n为1位时的场景
    const result = [0, 1]
    // 对n位进行遍历
    for (let i = 1; i < n; i++) {
        const len = result.length
        // 倒序循环,内层循环一次完毕,会递增len的长度,也就是让result中的元素翻一倍
        for (let j = len - 1; j >= 0; j--) {
            // 进行左移操作,并加入当前的值
            result.push((1 << i) + result[j])
        }
    }
    return result
};
  • 这是官方示例,两个for循环,内部使用了左移操作
  • 这个算法很精妙,比方案1好很多,而且效率也较高

到了这里,关于数据结构与算法之数组: Leetcode 89. 格雷编码 (Typescript版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)

    数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此

    2024年02月07日
    浏览(40)
  • LeetCode 刷题 数据结构 数组 485 最大连续1的个数

    给定一个二进制数组  nums  , 计算其中最大连续  1  的个数。 示例 1: 示例 2: 提示: 1 = nums.length = 105 nums[i]  不是  0  就是  1.   参看bilibli视频-up主 爱学习的饲养员,讲解的很清晰。 手把手带你刷Leetcode力扣|各个击破数据结构和算法|大厂面试必备技能【已完结】-

    2024年02月15日
    浏览(30)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 树状数组 (Binary Indexed Tree,BIT)是一种数据结构,用于高效地处理

    2024年03月11日
    浏览(52)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法、数据结构~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 数据结构各内部排序算法总结对比及动图演示(插入排序

    2024年03月26日
    浏览(75)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(35)
  • 数据结构与算法(一): 稀疏数组

    在五子棋游戏或类似的游戏中,我们可以把整个棋盘想象成是一个有规律的二维数组,其值由0、1、2三个数字组成,0代表空白区域,1代表白子,2代表黑子。这种情况:即当一个数组中大部分元素为0或者为同一值时,存储该数组数据可以使用稀疏数组来对原始数组进行精简,

    2024年02月11日
    浏览(36)
  • JavaScript数据结构与算法整理------数组

            数组的标准定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量 ,几乎所有的编程语言都有类似的数据结构,而JavaScript的数组略有不同。         JavaScript中的数组是一种特殊的对象,用来表示偏

    2023年04月24日
    浏览(48)
  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(38)
  • 数据结构与算法-数组(附阿里面试题)

            给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄   有多少人?          给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。 (这一句可以忽略)         在以上情况下你该如何以最高效的方法来解决这个

    2024年02月13日
    浏览(28)
  • 【数据结构和算法】使用数组的结构实现链表(单向或双向)

    上文我们通过结构体的结构实现了队列 、以及循环队列的实现,我们或许在其他老师的教学中,只学到了用结构体的形式来实现链表、队列、栈等数据结构,本文我想告诉你的是,我们 可以使用数组的结构实现链表、单调栈、单调队列 目录 前言 一、用数组结构的好处 1.数

    2024年01月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包