剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数。
一 . 题目分析
该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法。题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接遍历了一遍数组,有相同的就加1,代码量虽然很少,但这很显然是效率很低的方法。所以又重新码了二分查找法的代码。
根据题意,使用这种方法要考虑到两点:
1. 把二分查找法先构造出来。
2. 统计数字k在数组中出现次数。
二 . 代码实现
class Solution { public int GetNumberOfK(int[] data, int k) { // write code here // 鲁棒判断 if (data.Length == 0) return 0;
// 使用二分查找法:定义前指针min,后指针max,中间指针mid,计数器count int min = 0,max = data.Length - 1,mid = 0,count = 0;
// 构建二分查找模型 while(min <= max) { if (min > max) break; mid = (max+min)/2; if(data[mid] == k) { break; } else if(data[mid]<k) { min = mid+1; } else { max = mid-1; } }
// 若存在中间数 == k,给count赋值为1 if(data[mid] == k) { count = 1; }
// 统计一个k在排序数组中出现的次数 for (int i = 1; i < data.Length; i++) {
// 定义循环停止条件,提高效率 bool firstFlag = false; bool secondFlag = false;
// 左侧重复数的累加 if (mid - i >= 0 && data[mid - i] == k) { firstFlag = true; count++; }
// 右侧重复数的累加 if (mid + i < data.Length && data[mid + i] == k) { secondFlag = true; count++; }
// 循环停止条件 if (firstFlag == false && secondFlag == false) { break; } }
// 返回次数 return count; } }
做题目的时候最好先自己写写画画,设置好逻辑关系非常重要!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构