当前位置: 首页 > news >正文

C#数组操作实战:从求和到滑动窗口的22个经典练习(附完整代码)

C#数组操作实战:从求和到滑动窗口的22个经典练习(附完整代码)

在C#开发中,数组和字符串处理是最基础却最常被考察的核心能力。无论是日常业务逻辑编写,还是技术面试准备,高效的数组操作技巧都能显著提升代码质量。本文将带您通过22个典型场景,从简单的元素累加逐步深入到滑动窗口等高级算法,每个案例都配有可直接运行的代码示例和关键逻辑解析。

1. 基础数组操作:构建数据处理思维框架

1.1 元素统计三连击

数组求和、乘积和平均值计算是数据处理的基础操作。下面这个增强版方法集成了三种计算方式:

public class ArrayCalculations { public static (int Sum, long Product, double Average) ComputeAll(int[] arr) { if (arr == null || arr.Length == 0) throw new ArgumentException("数组不能为空"); int sum = 0; long product = 1; foreach (var num in arr) { sum += num; product *= num; } return (sum, product, (double)sum / arr.Length); } }

注意:乘积计算使用long类型避免整数溢出,特别是当数组元素较多或数值较大时。

1.2 极值查找的优化策略

传统极值查找需要两次遍历,而以下实现只需一次遍历:

public static (int Min, int Max) FindMinMaxOptimized(int[] arr) { if (arr == null || arr.Length == 0) throw new ArgumentException("数组不能为空"); int min = arr[0], max = arr[0]; int i = 1; // 成对比较减少比较次数 for (; i < arr.Length - 1; i += 2) { if (arr[i] < arr[i+1]) { min = Math.Min(min, arr[i]); max = Math.Max(max, arr[i+1]); } else { min = Math.Min(min, arr[i+1]); max = Math.Max(max, arr[i]); } } // 处理奇数个元素的情况 if (i == arr.Length - 1) { min = Math.Min(min, arr[i]); max = Math.Max(max, arr[i]); } return (min, max); }

这种优化算法比较次数比常规方法减少约25%,在大数据量时性能提升明显。

1.3 元素筛选的LINQ实践

使用LINQ可以优雅地实现各种筛选操作:

public static IEnumerable<int> FilterElements(int[] arr, Predicate<int> condition) { return arr.Where(x => condition(x)).ToArray(); } // 使用示例: var evenNumbers = FilterElements(new[] {1,2,3,4,5}, x => x % 2 == 0); var primes = FilterElements(new[] {2,3,4,5,6}, IsPrime);

2. 数组变形:掌握数据重组技巧

2.1 数组翻转的三种实现

原地翻转算法最节省内存:

public static void ReverseInPlace(int[] arr) { for (int i = 0; i < arr.Length / 2; i++) { (arr[i], arr[^(i+1)]) = (arr[^(i+1)], arr[i]); } }

新数组创建方式更符合函数式编程思想:

public static int[] ReverseToNewArray(int[] arr) { var result = new int[arr.Length]; for (int i = 0; i < arr.Length; i++) { result[i] = arr[arr.Length - 1 - i]; } return result; }

栈结构实现代码最简洁:

public static int[] ReverseUsingStack(int[] arr) { var stack = new Stack<int>(arr); return stack.ToArray(); }

2.2 矩阵旋转的坐标映射

N×N矩阵顺时针旋转90度的核心是找到位置映射关系:

public static void RotateMatrix(int[,] matrix) { int n = matrix.GetLength(0); for (int layer = 0; layer < n / 2; layer++) { int first = layer; int last = n - 1 - layer; for (int i = first; i < last; i++) { int offset = i - first; // 保存上边 int top = matrix[first, i]; // 左到上 matrix[first, i] = matrix[last-offset, first]; // 下到左 matrix[last-offset, first] = matrix[last, last-offset]; // 右到下 matrix[last, last-offset] = matrix[i, last]; // 上到右 matrix[i, last] = top; } } }

3. 字符串处理:特殊数组的算法

3.1 回文检测的Unicode处理

增强版回文检测支持Unicode字符和标点符号过滤:

public static bool IsPalindrome(string s) { int left = 0, right = s.Length - 1; while (left < right) { while (left < right && !char.IsLetterOrDigit(s[left])) left++; while (left < right && !char.IsLetterOrDigit(s[right])) right--; if (char.ToLower(s[left]) != char.ToLower(s[right])) return false; left++; right--; } return true; }

3.2 字符串压缩的游程编码

优化版字符串压缩算法:

public static string CompressString(string str) { if (string.IsNullOrEmpty(str) || str.Length < 3) return str; var sb = new StringBuilder(); int count = 1; char current = str[0]; for (int i = 1; i < str.Length; i++) { if (str[i] == current) { count++; } else { sb.Append(current).Append(count); current = str[i]; count = 1; } } sb.Append(current).Append(count); return sb.Length < str.Length ? sb.ToString() : str; }

4. 高级算法实战:应对技术面试

4.1 两数之和的哈希解法

时间复杂度O(n)的优化方案:

public static int[] TwoSum(int[] nums, int target) { var numDict = new Dictionary<int, int>(); for (int i = 0; i < nums.Length; i++) { int complement = target - nums[i]; if (numDict.TryGetValue(complement, out int index)) { return new[] { index, i }; } numDict[nums[i]] = i; } throw new ArgumentException("No solution found"); }

4.2 滑动窗口最大值问题

使用双端队列实现O(n)时间复杂度:

public static int[] MaxSlidingWindow(int[] nums, int k) { if (nums == null || k <= 0) return Array.Empty<int>(); var result = new int[nums.Length - k + 1]; var deque = new LinkedList<int>(); for (int i = 0; i < nums.Length; i++) { // 移除超出窗口范围的元素 while (deque.Count > 0 && deque.First.Value < i - k + 1) deque.RemoveFirst(); // 移除小于当前元素的队列元素 while (deque.Count > 0 && nums[deque.Last.Value] < nums[i]) deque.RemoveLast(); deque.AddLast(i); // 记录窗口最大值 if (i >= k - 1) result[i - k + 1] = nums[deque.First.Value]; } return result; }

4.3 最长无重复子串的滑动窗口

public static int LengthOfLongestSubstring(string s) { var charIndex = new Dictionary<char, int>(); int maxLength = 0, left = 0; for (int right = 0; right < s.Length; right++) { if (charIndex.ContainsKey(s[right])) { left = Math.Max(left, charIndex[s[right]] + 1); } charIndex[s[right]] = right; maxLength = Math.Max(maxLength, right - left + 1); } return maxLength; }

这些案例覆盖了数组和字符串处理的典型场景,从基础到高级逐步深入。实际开发中,建议根据具体需求选择合适的算法,并注意边界条件的处理。例如在处理用户输入时,总是验证数组是否为空或null,避免潜在的运行时异常。

http://www.jsqmd.com/news/486515/

相关文章:

  • 点云配准新思路:当PointNet遇上LK光流算法(附与ICP性能对比测试)
  • 技术解析:cursor-free-vip功能扩展与优化指南
  • Leather Dress Collection 一键部署效果:开箱即用的高质量对话体验
  • 3种突破方案让群晖DSM 7.2.2重获Video Station视频管理能力
  • 【Vcenter 8.0】从零开始:一步步教你完成安装与部署
  • 瑜伽服、光影、体式全精准还原:雯雯的后宫-造相Z-Image-瑜伽女孩效果实测
  • 3步解锁OCAuxiliaryTools:让OpenCore配置效率提升90%的实战指南
  • 6. ESP32-S3 MicroPython串口通信实战:从参数配置到UART1/2数据收发
  • 【Dify Multi-Agent架构黄金标准】:基于17个真实客户POC验证的4层3通道协同架构模型
  • SENAITE LIMS实战指南:环境检测全流程管理的第三方检测机构解决方案
  • 从Hello World到寄存器操作:汇编语言新手入门实战指南(附NASM示例)
  • 2026年3月山东电线电缆厂家推荐:阳谷电缆、阻燃电缆、低压电缆、高压电缆、屏蔽电缆、橡套电缆、控制电缆、铝芯电缆、铜芯电缆、电力电缆厂家选择指南 - 海棠依旧大
  • 2026山东电线电缆最新推荐:铝芯电缆、铜芯电缆、电力电缆、耐火电缆、光伏线、铜芯线、高柔性拖链屏蔽电缆、高柔性双绞屏蔽线、耐高温电缆线选择指南 - 海棠依旧大
  • ATV930变频器以太网通讯必看:Modbus TCP vs Ethernet IP协议选择指南(附M580 PLC配置截图)
  • 从高风险到安全线:百考通智能优化,让原创内容摆脱“机器感”
  • 2026西北房车产服优选五强加冕:五大品牌开启全景旅居新篇章 - 深度智识库
  • C++实战:用jsoncpp处理复杂JSON数据(嵌套数组/对象解析技巧)
  • 被系统判定“论文是AI写的”?别慌——真正的解决之道不是伪装,而是澄清
  • 2026年如何找到靠谱的云南星迪台球桌工厂?评测告诉你 - 2026年企业推荐榜
  • 2026实验室设计/建设领域推荐:西安科创实验室为何稳居榜首? - 深度智识库
  • 【MCP同步可靠性白皮书】:基于127个微服务节点的实测数据,构建99.999%状态一致性的6步落地框架
  • 2026年重庆火锅底料厂家哪家好?本地品牌盘点:麻辣火锅底料、牛油火锅底料、不辣火锅底料、烧菜火锅底料、特辣火锅底料厂家选择指南 - 海棠依旧大
  • 【luckfox】从零开始:开发环境搭建全攻略
  • 论文自己写的,却被系统判“87%是AI”?我用这个方法30分钟自救成功
  • cppreference
  • 2026 年云南镀锌管优质企业汇总 实力强口碑好的钢材厂家介绍 - 深度智识库
  • 这套 Vue3 + UniApp 企业级架构,包括OA、人力、CRM、ERP等多模块,一套代码通吃 H5/小程序/iOS/Android
  • Claude 上线组团审代码:一条 PR 最高 25 美元,你的代码库还得“上交“给它
  • 2026-03-15 全国各地响应最快的 BT Tracker 服务器(电信版)
  • 2026年重庆火锅底料厂家优选:麻辣火锅底料、牛油火锅底料、不辣火锅底料、烧菜火锅底料、 特辣火锅底料厂家选择指南、饭巢品牌用匠心坚守重庆本味 - 海棠依旧大