10 YzlCoder

尚未进行身份认证

我要认证

未曾有过远大的梦想,只想用双手敲写明天

等级
TA的排名 5k+

Lua元表应用___数据检查

1. 前言在游戏项目中,Lua一般被广为使用在UI界面上,因为其轻巧,简便,支持热更新等特点。当然,有的游戏的单局中也使用了Lua。然而Lua语言的缺点也很明显,因为是弱类型语言,有的编码上的错误不容易被发现。例如变量名的错误拼写并不会带来编译的错误。比如游戏中有个配置文件,存放了各个数据模型的定义:DataModelDef = DataModelDef or{}DataModelDef.FubenConfigDataModel ={ FubenId = 0; Fuben

2020-06-20 22:38:09

【Lua 5.3源码】虚拟机指令分析(三) 赋值指令

1. 赋值指令Lua中的赋值指令有如下几个:OP_MOVE A B R(A) := R(B)OP_LOADK A Bx R(A) := Kst(Bx)OP_LOADKX A R(A) := Kst(extra arg)OP_LOADBOOL A B C R(A) := (Bool)B; if (C) pc++OP_LOADNIL A B R(A), R(A+1), …, R(A+...

2019-12-21 22:10:26

【Lua 5.3源码】虚拟机指令分析(二)

1. Proto函数原型任何一个函数,一个 lua 文件, 经过编译之后都会对应变成Lua的一个LClosure(闭包)对象,一个闭包包含一个函数原型(Proto)和一个upvalues列表。typedef struct LClosure { ClosureHeader; struct Proto *p; UpVal *upvals[1]; /* list of upvalues...

2019-12-21 13:07:02

LeetCoder_____ 不同路径Ⅱ(63)

1. 思路跟上一个题目相比,添加了路障,其实对于有路障的题目也可以用组合数来做,需要用到组合数+容斥定理,详情可以参见我之前出的一个题目:亡灵峡谷不过这里因为N,M足够小,所以可以使用动态规划进行求解,在上一个题目的基础上呢,我们只需要将有障碍的dp值为0即可。2. 代码class Solution {public: int uniquePathsWithObstacles(v...

2019-12-15 22:15:54

LeetCoder_____ 不同路径(62)

1. 思路A看题目比较简单,有两种做法,第一种做法是数学方法,从左上走到右下,要横着走N-1次,竖着走M-1次,那么其实就是在M+N-2次中选择其中N-1次横着走。这就变成了一个组合数学问题。即是:Cm+n−2n−1C^{n-1}_{m+n-2}Cm+n−2n−1​不过需要注意的是溢出问题。2. 代码Aclass Solution {public: int uniquePath...

2019-12-15 22:00:21

LeetCoder_____ 旋转链表(61)

1. 思路较为简单的一个链表操作题目,只需要找到链表的长度L,移动的长度对链表的长度取模就是真实的移动距离K。将链表头尾相接,然后再将第L-K-1和第L-K个节点分开就是最后的结果。不过需要注意的是特殊情况,比如移动距离为0,以及链表是个空链。2. 代码/** * Definition for singly-linked list. * struct ListNode { * ...

2019-12-10 21:39:29

【Lua 5.3源码】虚拟机指令分析(一)

1. Lua虚拟机简介Lua VM 使用的是 基于寄存器的虚拟机(Register-based)。 指令都是在已经分配好的寄存器中存取操作数。add a b c 将 寄存器 b 与 寄存器 c 中的值相加,结果存在 寄存器 a 中。 标准的三地址指令,每条指令的表达能力很强,并有效的减少了内存赋值操作。ADD C,A,B //将A,B寄存器里面的值相加后赋值给C寄存器除此之外还有一种虚...

2019-12-08 18:35:22

LeetCoder_____ 第k个排列(60)

1. 思路康拓展开,具体思路如下:对于1,2,3,4的所有排列,假如找第15个:我们知道确定第一个元素,其余三个的所有组合数为6种,所以以1,2开头的所有组合数为12种,1,2,3开头的组合数为18种。可以推断第一个数为3,那么通过递归分析可以将原问题转化为1,2,4的所有排列中找第3个(15-3)。2. 代码class Solution {public: string getPe...

2019-12-02 21:44:53

LeetCoder_____ 螺旋矩阵 II(59)

1. 思路和之前的螺旋矩阵类似,只不过可以通过数组值是否为0判断是否已经填写过。2. 代码class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> ret(n, vector<int>(n...

2019-12-02 21:41:02

LeetCoder_____ 最后一个单词的长度(58)

1. 思路倒序遍历,遇到字符累加,当遇到空格并且累加值不为0的时候就是最后一个单词开始。输出即可2. 代码class Solution {public: int lengthOfLastWord(string s) { int sum = 0; for(int i = s.length() - 1; i >= 0; --i) ...

2019-12-02 21:40:04

LeetCoder_____ 插入区间(57)

1. 思路和56题类似,因为题目已经保证了有序,那么我们只需要通过类似于冒泡的思路O(n)的时间复杂度将新区间插入并排序,然后就和56题一样的做法2. 代码class Solution {public: vector<vector<int>> insert(vector<vector<int>>& intervals, ve...

2019-11-28 08:44:38

LeetCoder_____ 合并区间(56)

1. 思路这个题目其实只需要先将所有区间按照区间左边界从小到大排序。然后遍历的过程中,判断当前区间和前面是否有重叠,如果有就更新右边界的值,如果没有重叠,就作为一个独立的区间存储起来。我们可以直接在原数组里面进行更新,保证了空间复杂度为O(1)。因为有排序所以时间复杂度为O(nlogn)2. 代码class Solution {public: vector<vector&l...

2019-11-28 08:42:34

LeetCoder_____ 跳跃游戏(55)

1. 思路其实我们只需要遍历数组,更新一个最大能跳的距离,如果当前遍历的点超过了最大能跳的距离,说明当前点不可到达,那么最后一个位置同样不能到达。2. 代码class Solution {public: bool canJump(vector<int>& nums) { int maxLength = 0, n = nums.size(); ...

2019-11-28 08:39:37

LeetCoder_____ 螺旋矩阵(54)

1. 思路模拟题目,沿着外面一圈一圈的遍历。2. 代码class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.size() == 0) return {}; int n = matr...

2019-11-28 08:37:48

LeetCoder_____ 最大子序列和(53)

1. 思路A这个题目是一个很经典的DP(动态规划)问题,我们定义dp[i]表示以i结尾的子序列最大和为多少,那么递推关系就很明确了,对于一个位置X,要么连上前面X+dp[X-1],要么自己单独成为子序列开始X,所以结果就是两者较大值:dp[x]=max(dp[x−1],0)+xdp[x]=max(dp[x-1],0)+xdp[x]=max(dp[x−1],0)+x时间复杂度O(n),空间复杂...

2019-11-28 08:36:30

LeetCoder_____ N皇后 II(52)

1. 思路和N皇后1问题类似,深度搜索,记录个数即可2. 代码class Solution {public: int totalNQueens(int n) { vector<bool> vis1(n), vis2(2*n), vis3(2*n); int ret = 0; dfs(ret, 0, n, vis1, vi...

2019-11-28 08:27:40

LeetCoder_____ 按要求补齐数组(330)

1. 题目给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。示例 1:输入: nums = [1,3], n = 6输出: 1解释:根据 nums 里现有的组合 [1], [3], [1,3],可...

2019-11-25 23:36:18

LeetCoder_____ N皇后(51)

1. 思路很经典的深度优先搜索题目了。按照行进行搜索,保证了每行只有一个;用vis1来记录每列是否有旗子,保证每列只有一个左上右下斜线如何记录呢,观察可以发现这条线上的所有坐标x,y的差值是一定的,所以可以用vis2来记录x,y的差值。如果某两个个坐标差值一样表示这两个点在同一斜线上。同理右上左下使用vis3记录x,y两个坐标的和。2. 代码class Solution {p...

2019-11-21 20:07:27

LeetCoder_____ Pow(x, n)(50)

1. 思路其实这个题目没有要求精度,仅仅是简单考一个二分快速幂。不过需要注意的是,因为题目中的N可能是负数,在转化为正数的时候需要记住-INT_MAX取反是会超过int范围的。也不能先算幂,最后取倒数,因为会溢出。所以需要在0x80000000 < n && n < 0 这个范围内,就要进行取倒数了。当然也可以直接偷懒用long,防止溢出。2. 代码cla...

2019-11-21 20:02:02

LeetCoder_____ 字母异位词分组(49)

1. 思路如何将异位词hash到同一个值是我们需要解决的问题,有很多种方法,排序、算每个字符出现的个数等。这里我们选择排序,异位词经过排序后的是一样的。再利用Map将异位词映射到一个数组中。2. 代码class Solution {public: map<string, vector<string>> mpt; vector<vector&...

2019-11-21 19:57:43

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。