本文首发于微信公众号:呼哧好大枫。原作者与本文作者是同一人。

平常在做算法题或者是 debug 的时候很需要一款能够实时地将代码执行逻辑和数据以图形化的形式渲染出来的工具。之前尝试了几款(visual studio 的 debug 功能、VS Code 的 Debug Visualizer 插件),不是图形化的程度不够,就是使用起来太麻烦,效果都不尽如人意。直到我发现了这款:

stay:https://staying.fun/zh/features/algorithm-visualize

话不多说,直接看实际效果。下面是一个经典荷兰国旗算法的实现代码。其中还是有一些比较难以理解点的,尤其是在 0 区间和 1 区间的扩大和缩小,结合图形化的演示可以更直观地理解算法原理:

def sortColors(nums):
n = len(nums) # 区间划分法
# [0, j]为0区间,初始为空
j = -1
# [j + 1, i]为1区间,初始为空
i = 0
# [i + 1, k)为2区间,初始为空
k = n # 初始从1区间开始遍历,遇到0就交换到前面,遇到2就交换到后面
while i < k:
if nums[i] == 0:
# 扩大0区间,1区间向后移动一个位置
j += 1
if i != j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
elif nums[i] == 2:
k -= 1
nums[i], nums[k] = nums[k], nums[i]
else:
i += 1 nums = [2, 0, 2, 1, 1, 0]
sortColors(nums)
print(nums) # 输出排序后的结果

在 stay 上的图形化渲染效果如下:

毫不夸张地说,staying 完美实现了我心目中最完美的代码图形化:在调试的时候,我更关心的不是代码底层堆栈的执行情况。我只是想像翻译软件一样,把代码一行一行地翻译成动图显示在我的面前。staying 实现的优点还不止这些:

  1. 以网站形式对外开放,不像现在很多工具动不动就要下载 APP;
  2. 界面简洁单一,没有大片的广告和付费引导,至少暂时可以没有,基本的功能都可以免费使用;

  1. 对一些复杂的算法(如树、图等)也有很好的支持


当然,stay 目前处于测试阶段(BETA),也有一些难以忍受的缺点:

  1. 目前仅支持 Python 和 JavaScript。做算法题还是 C++用得多一些,希望官方尽快上线 C++语言的支持;
  2. 似乎没有代码动图的导出功能,这对一些喜欢写题解的童鞋来说不是很方便。

stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了的更多相关文章

  1. 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了

    写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...

  2. Python 在线免费批量美颜,妈妈再也不用担心我 P 图两小时啦

    引言 首先我承认自己标题党了,我就想提升点阅读量我容易么我,前几天的篇纯技术文阅读量都扯着蛋了. 毕竟阅读量太低实在是没有写下去的动力,我只能用点小手段偶尔提升下阅读量. 这篇文章我转换下套路,先放结 ...

  3. [置顶] 【机器学习PAI实践十一】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码

    背景 最近互联网上出现一个热词就是"freestyle",源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的 ...

  4. 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)

    背景 最近互联网上出现一个热词就是“freestyle”,源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的根据一段主题讲一串r ...

  5. 有了代码变更分解提交工具SmartCommit,再也不担心复合提交了

    摘要:文将介绍一个代码提交辅助工具SmartCommit,其主要功能是通过杂糅变更分解算法自动生成分组提交方案,接受开发者的反馈和交互式调整,渐进式地引导和辅助开发者做出符合最佳实践的原子提交. 本文 ...

  6. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  7. 八大排序算法——堆排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 先来了解下堆的相关概念:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如 ...

  8. 八大排序算法——希尔(shell)排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 简单插 ...

  9. 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...

  10. 八大排序算法——归并排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序 1.  向上归并排序的时候,需要一个暂存数组用来排序, 2.  将 ...

随机推荐

  1. Mybatis【13】-- Mybatis动态Sql标签的使用

    mybatis有一个强大的特性,其他框架在拼接sql的时候要特别谨慎,比如哪里需要空格,还要注意去掉列表最后一个列名的逗号,mybtis的动态sql可以帮助我们逃离这样的痛苦挣扎,那就是动态SQL.它 ...

  2. 鸿蒙NEXT元服务:收藏、卡片、用户协议、隐私声明、分享链接、评分与评论

    相比应用,元服务的功能藏的比较深,这里记录一下常用功能的位置. 1.收藏(添加至我的服务) 打开元服务-->右上角四个点-->添加至我的服务-->手机滑到负一屏-->点击&qu ...

  3. Numpy本征值求解

    技术背景 Numpy是一个Python库中最经常被用于执行计算任务的一个包,得益于其相比默认列表的高性能表现,以及易用性和可靠性,深受广大Python开发者的喜爱.这里介绍的是使用Numpy计算矩阵本 ...

  4. Net使用EasyNetQ简化与RabbitMQ的交互

    Net使用EasyNetQ简化与RabbitMQ的交互 EasyNetQ是一个为.NET环境设计的RabbitMQ客户端API,旨在简化与RabbitMQ的交互. 关于RabbitMq的更多知识点在: ...

  5. Linux编译安装MySQL__5.7.26记录

    系统:centos7.4(3.10内核) 1.查找并清除自带的数据库# rpm -qa | grep mariadb# rpm -e --nodeps mariadb-libs-5.5.44-2.el ...

  6. Docker安装开源版obs对象存储服务minio,并后台运行

    ​​>Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据. 例如 ...

  7. Spring Cloud Sleuth in a Monolith Application

    1. Overview   In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...

  8. getway网关跨域问题记录

    一.问题产生环境 1.1 为什么会产生跨域问题? 跨域不一定都会有跨域题. 因为跨域问题是浏览器对于ajax请求的一种安全限制: 一个页面发起的 ajax请求,只能是与当前页域名相同的路径,这能有效的 ...

  9. 基于Three.js的大屏3D地图(一)

    依赖安装 yarn add three yarn add @types/three yarn add d3-geo three库安装后在node_modules下其还包含核心three/src和插件t ...

  10. Qt/C++编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)

    一.前言 大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴着操 ...