徐少侠的算法 见 有道难题第一题非OO解,极端记录160ms
static public int countSpecialNumbers(string[] field, int A, int B)
{
//一开始就对A和B 加 384,这样就不需要每次计算都减384了,减少了不少减法运算
A += '0' * 8;
B += '0' * 8;

int count = 0;
//因为加了一圈0以后整体行列数发生了变化
int cols = field[0].Length + 2;

//将原有一维字符串数组进行转换并增加0
string s = string.Concat(new string('0', cols + 1), String.Join("00", field), new string('0', cols + 1));

//int i;
//一次循环
//不循环外圈的0

for (int i = cols + 1; i < s.Length - cols - 1; i++)
{
int m = i % cols; //m 为 i 和 列宽取模,如果模为0 或者cols-1 则说明是外圈的0
if (m > 0 && m < cols - 1)
{
int number = s[i - cols - 1] + s[i - cols] + s[i - cols + 1] +
s[i - 1] + s[i + 1] +
s[i + cols - 1] + s[i + cols] + s[i + cols + 1];

if (number >= A && number <= B)
{
count++;
}
}
}

return count;
}
这个算法的效率已经很高了,徐少侠后来又写了一个一次循环的,但效率没有提高。我的思路也是把两次循环改为一次循环,效率上提高了20%左右。
其实这个性能优化就是扣细节了,算法上没有什么改进
对两处进行改进
1. 一开始就对A和B 加 384,这样就不需要每次计算都减384了,减少了不少减法运算
2. 一次循环
另外eaglet 在考虑,是否可以考虑类似图像有损压缩的算法,把这个这个矩阵利用类似正交余弦变化转换到频域,
再通过频率域的数值分布得到特殊值在A,B 范围内的有效区域,然后针对这些有效区域进行运算,这样可以大大降低
运算的次数。不过这个数学模型真的很难建。



































测试结果
eaglet 的原来的算法
5
9
3
0
0
26
用时917毫秒
徐少侠 的算法
5
9
3
0
0
26
用时554毫秒
eaglet改进的算法
5
9
3
0
0
26
用时459毫秒
改进后性能比徐少侠的提高了18%
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述