字母板上的路径[提取公共代码,提高复用率]

news2024/9/21 2:44:04

提取公共代码

  • 前言
  • 一、字母版上的路径
  • 二、贪心
    • 1、idea
    • 2、go
    • 3、代码不断拆分复用的过程
  • 总结
  • 参考文献

前言

写代码,在提高效率的同时,要方便人看,这个人包括自己。大函数要拆分成一些小函数,让每个函数的宏观目的和步骤都显得清晰,读起来才容易懂。除此之外,拆分也有讲究,提取公共代码,尽量减少重复无意义的代码,提高复用率。

一、字母版上的路径

在这里插入图片描述

二、贪心

1、idea

// 根据字母的ascall码可以确定它在board中的坐标。
// a - 97 == v,<x = v / 5,y = v % 5>
// cur:<0,0> t: <x,y>
// 前5行,先x或者y都无所谓
// 前五行到第6行,只能先y再x
// 第6行到前5行,只能先x再y

2、go

func alphabetBoardPath(target string) string {
    sb := &strings.Builder{}
    n := len(target)
    x,y := 0,0
    upDown,LeftRight := [2]byte{'U','D'},[2]byte{'L','R'}

    for i := 0;i < n;i++ {
        // 定位该字符在黑板上的坐标
        v := target[i] - 97
        nx,ny := int(v / 5),int(v % 5)
        // 根据当前坐标和目的坐标进行移动。
        if nx == 5 {// 去z那个地方,必须先L,再D
            move(y,ny,sb,LeftRight)
            move(x,nx,sb,upDown) 
        } else {
            move(x,nx,sb,upDown)
            move(y,ny,sb,LeftRight) 
        }
        // 寻找到该字符,将其加入。
        sb.WriteByte('!')
        x,y = nx,ny
    }
    return sb.String()
}
// 不断抽象,复用代码。
// 最开始是xY(int,int,int,int,*strings.Builder)函数,以及yX(int,int,int,int,*strings.Builder)函数;
// 发现对x或y的动作是一致的,所以拆解成单个x的动作moveX | moveY,
// 继续抽象,moveX | moveY代码都差不多,只是加入的ch不一样,所以将ch当作变量传入,将两函数合并成move函数。
func move(z,nz int,sb *strings.Builder,choice [2]byte){
    zGap := z - nz
    ch := choice[0]

    if zGap < 0 {
        ch = choice[1]
    }
    for i := 0;i < abs(zGap);i++ {
        sb.WriteByte(ch)
    }
}
func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}

3、代码不断拆分复用的过程

// 不断抽象,复用代码。
// 最开始是xY(int,int,int,int,*strings.Builder)函数,以及yX(int,int,int,int,*strings.Builder)函数;
// 发现对x或y的动作是一致的,所以拆解成单个x的动作moveX | moveY,
// 继续抽象,moveX | moveY代码都差不多,只是加入的ch不一样,所以将ch当作变量传入,将两函数合并成move函数。
func move(z,nz int,sb *strings.Builder,choice [2]byte){
    zGap := z - nz
    ch := choice[0]

    if zGap < 0 {
        ch = choice[1]
    }
    for i := 0;i < abs(zGap);i++ {
        sb.WriteByte(ch)
    }
}

总结

1)每个函数拆分,做到有清晰的宏观目的和宏观步骤,这样后来的人包括自己才能更容易的看懂。
2)拆分代码,也要提取公共代码,尽量减少重复无意义的代码,提高复用率。

参考文献

[1] LeetCode 字母板上的路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享微信点餐小程序搭建步骤_微信点餐功能怎么做

线下餐饮实体店都开始摸索发展网上订餐服务。最多人选择的是入驻外卖平台&#xff0c;但抽成高&#xff0c;推广还要另买流量等问题&#xff0c;也让不少商家入不敷出。在这种情况下&#xff0c;建立自己的微信订餐小程序&#xff0c;做自己的私域流量是另一种捷径。那么&#…

分类模型评估:混淆矩阵、准确率、召回率、ROC

1. 混淆矩阵 在二分类问题中&#xff0c;混淆矩阵被用来度量模型的准确率。因为在二分类问题中单一样本的预测结果只有Yes or No&#xff0c;即&#xff1a;真或者假两种结果&#xff0c;所以全体样本的经二分类模型处理后&#xff0c;处理结果不外乎四种情况&#xff0c;每种…

反应-扩散方程(Reaction-diffusion system)

文章目录单组分反应-扩散方程双组分反应-扩散方程三组分和更多组分的反应-扩散方程Fishers equationKPP方程Belousov–Zhabotinsky reaction历史化学机理变体Noise-induced order数学背景Briggs–Rauscher reactionZFK equation行波解渐近解外部区域内部区域KPP-ZFK 转变Clavin…

13-PHP使用过的函数 121-130

121、bindColumn 将字段绑定到变量上 // while,foreach,list()进行结果数组的解构&#xff0c;解构到变量中; //!要在预处理对象上调用bindColumn函数 $stmt->bindColumn(id,$id); $stmt->bindColumn(name,$name); $stmt->bindColumn(sex,$sex); $stmt->bindColumn…

flink solt概念详解

ask是flink中的一个逻辑概念&#xff0c;一个任务由一个或者多个算子组合而成(多个算子构成一个任务是需要满足一定的条件才可以&#xff0c;有兴趣的老铁可以来了解一下 Operator Chain),为了提升任务执行的效率&#xff0c;可以对任务配置并行度&#xff0c;使任务在实际运行…

【服务器数据恢复】FreeNAS层UFS2文件系统数据恢复案例

服务器数据恢复环境&#xff1a; Dell存储服务器&#xff0c;采用esxi虚拟化系统&#xff0c;esxi虚拟化系统里有3台虚拟机&#xff1b;上层iSCSI使用FreeNAS构建&#xff0c;通过iSCSI方式实现FCSAN功能&#xff1b;FreeNAS层采用UFS2文件系统。 esxi虚拟化系统里有3台虚拟机中…

python中使用numpy包的向量矩阵相乘

一直对np的线性运算不太清晰&#xff0c;正好上课讲到了&#xff0c;做一个笔记整个理解一下 1.向量和矩阵 在numpy中&#xff0c;一重方括号表示的是向量vector&#xff0c;vector没有行列的概念。二重方括号表示矩阵matrix&#xff0c;有行列。 代码显示如下&#xff1a; …

VMware 复制已有的虚拟机并修改IP地址

第一步&#xff1a;关闭当前机器第二步&#xff1a;在VMware中右键要克隆的机器 选择管理-->克隆第三步&#xff1a;启动新克隆的虚拟机 修改主机名 如 hostname slave2第四步&#xff1a;修改克隆的虚拟机的ip地址和mac地址&#xff08;注意&#xff1a;由于slave2是克隆出…

直流电机驱动模块开发,为电子设备提供动力之源

直流电机分为有刷直流电机和无刷直流电机两种&#xff0c;有刷直流电机连接上直流电就能转动&#xff0c;但是想要做到精准的转速和方向控制离不开电机驱动模块&#xff1b;无刷直流电机则必须要有驱动才能转动&#xff0c;直流电机驱动模块能够充分利用和有效发挥电源的能量功…

MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升

经过两个 Beta 版本迭代&#xff0c;近日&#xff0c;MQTT 5.0 客户端工具 MQTT X 正式发布了 1.9.1 稳定版本。 该版本通过大规模性能优化以及已知问题修复实现了稳定性的飞跃提升。特别是在性能方面&#xff0c;以接收大量消息场景为例&#xff0c;v1.9.1 相比于上一版本&am…

【数据结构与算法】单调队列 | 单调栈

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

【Python入门第七天】Python 数字

Python 数字 Python 中有三种数字类型&#xff1a; intfloatcomplex 为变量赋值时&#xff0c;将创建数值类型的变量&#xff1a; 实例 x 10 # int y 6.3 # float z 2j # complex如需验证 Python 中任何对象的类型&#xff0c;请使用 type() 函数&#xff1a; 实…

计算机图形学:中点Bresenham算法画椭圆

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、实现思路二、…

分布式-分布式事务和分布式锁

分布式事务有哪些解决方案 分布式事务 指事务的参与者、支持事务操作的服务器、存储等资源分别位于分布式系统的不同节点之上。 分布式事务就是一个业务操作&#xff0c;是由多个细分操作完成的&#xff0c;而这些细分操作又分布在不同的服务器上&#xff1b;事务&#xff0c…

数据库(第一天)

文档信息 文档类别正式文档文档编号数据库基础课 1.2-001版本1.2-001文档名称数据库基础课编写负责人/编写时间梁昭东/2023 年 1 月 30 日审核负责人/审核时间年 月 日批准人/批准时间年 月 日 变更记录 日期版本号变更内容修订者2023.01.30v1.2版根据实际情况增删了部分内容…

LINUX【线程概念】

线程线程概念线程的优点线程的缺点线程异常线程用途linux进程和线程线程控制pthread 库创建线程线程等待线程退出线程分离线程互斥线程互斥相关概念线程互斥互斥量互斥量接口初始化互斥量销毁互斥量互斥量的加锁和解锁互斥量实现原理线程概念 线程是进程中的一个执行流 一个进程…

ShonyDanza:如何利用Shodan实现自定义的安全研究与网络防护

关于ShonyDanza ShonyDanza是一款支持自定义且易于使用的安全工具&#xff0c;该工具基于Shodan实现其功能&#xff0c;并且可以利用Shodan的强大能力帮助研究人员实现安全研究、安全测试和安全防护等任务。 ShonyDanza的功能包括&#xff1a; 1、根据搜索条件获取IP 2、根据…

LabWindows CVI 2017开发笔记--串口调试软件实例

一、新建工程 打开LabWindows CVI软件&#xff0c;在桌面新建SerialDebug文件夹用来保存工程文件&#xff0c;在欢迎页点击New–>Project 或者在软件首页点击File–>New–>Project 将Project创建在新的Workspace中&#xff0c;设置完成后点击OK 新建一个用户GUI界…

内存溢出、内存泄露的概述及常见情形

内存溢出&#xff08;OutofMemoryError&#xff09; 简述 java doc 中对 Out Of Memory Error 的解释是&#xff0c;没有空闲内存&#xff0c;并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理&#xff0c;由于 GC&…

functional interface

更优雅 案例 要在TodoTaskRepository写find方法找到对应task列表&#xff0c;传入自定义的如何find 要传入两个参数&#xff0c;返回一个bool&#xff0c;在文档里找这样的functional interface java8官方文档-Package java.util.function BiPredicate是这样的 接口函数是t…