这一段循环:
本质上是寻找对应字符从右侧开始数起时的位置,不存在返回 0
。
例如下述代码能通过检查:
检查 (测试代码 (“123123123”, “1”) = “2”)
检查 (测试代码 (“123123123”, “9”) = “0”)
此外因为查找的字符已知都是单个字符,可以提前替换为对应的字节(或利用 取代码 (“1”, )
等方法获取)来计算,并返回整数型,在需要展示到编辑框时再转换。
利用 C 运行时的 strrchr
可以快速找到对应的位置:
使用方法也和之前没有太大区别:
检查 (测试代码_修改 (“123123123”, #键1) = 2)
检查 (测试代码_修改 (“123123123”, #键9) = 0)
最后,若是你需要对多个字符进行检测,可以提前计算码表,然后直接访问码表:
使用的时候直接将字符码作为索引传递即可:
.版本 2
.局部变量 码表, 整数型, , "0"
' 相同输入的字符串,只需要计算一次
测试代码_修改2 (码表, “123123123”)
检查 (码表 [49] = 2) ' #键1
检查 (码表 [57] = 0) ' #键9
最后对正确性和性能进行测试:
性能测试结果(每个方法都跑 1000 × 100 × 2
次):
* 测试代码: 耗时 547ms
* 测试代码_修改: 耗时 156ms
* 测试代码_修改2 (码表访问): 耗时 0ms
因为你的 输出_out0.内容
在计算时没有变过,提前计算一次码表然后在需要时进行快速查表应该是最快的方法,也是典型的用内存空间换时间算法。
回到你的第一张图,对 输入数组
的处理也可以按照类似的思路来,不要使用字符串进行数据处理,而是储存对应的数值。
可以使用 sscanf
快速将数据解构到整数型数组;另外可以添加而非删除:
因为提前利用 数组排序
对解析出来的五个数字进行排序,检查数组是否存在
就可以利用二分法来快速查找了(不过如果只有 5 项,或许效率不如一个一个排查…)。
最后编写测试案例:
本文的完整易语言代码参考: 52pj-tid-1896115.7z
最后,如果没有必要,不需要太频繁更新窗口控件,尤其是循环内。窗口控件数据的获取和更新会带来比较大的延时。