数组中的等差数列 【微软面试100题 第九十四题】
题目要求
求随机数构成的数组中长度大于等于3的最长的等差数列,输出等差数列由小到大,如果没有符合条件的就输出。
例如输入{1,3,0,5,-1,6}
输出{-1,1,3,5}
代码实现
#include<iostream> #include<algorithm> #include<stack> using namespace std; void clear(stack<int > &ss)//清空栈 { while(ss.size()>0) ss.pop(); } void copy(stack<int > ss,stack<int> &max) //用栈ss 的内容去赋值 max栈 { while(!ss.empty()) { max.push(ss.top()); ss.pop(); } } int longest(int a[], int len) //求最长的等差数列 { sort(a,a+len); //先对数组进行排序 unsigned int max = 1;//记录最长的等差数列的长度 stack< int> ss;// 记录当前等差数列的元素 stack< int> maxstack;// 记录目前已知的最长等差数列的元素 for(int i=0;i<len;i++)//等差数列的第一个元素 { ss.push(a[i]); //第一个元素入栈 for(int j=i+1;j<len;j++)//等差数列的第二个元素 { ss.push(a[j]); //第二个元素入栈 int diff = a[j] - a[i];// 公差 int base = a[j];// 这个是查找下一个元素用 //int length = 2; for(int k = j+1;k<len;k++) { if(a[k] == (base+diff))// 如果当前等差数列的下一个元素是 a[k] { ss.push(a[k]); //a[k]入栈 //length++; base = a[k]; //更新base 为当前元素,查找下一个元素 base+diff即可 } } if(ss.size()>max)// 如果当前得到的最长数列,比已知的最长数列长 { max = ss.size(); //更新最长长度 clear(maxstack); //清空maxstack copy(ss,maxstack);// 更新最长数列的所有元素 } while(ss.size()>1)// 重新选择第二个元素 a[j],所以需要pop 所有元素只留下第一个 { ss.pop(); } } clear(ss); //清空ss ,重新选择第一个元素 a[i] } if(maxstack.size()>2) { while(maxstack.size()>0)// 输出最长的数列 { cout<<maxstack.top()<< " "; maxstack.pop(); } } if(max<3) return 0; cout<<endl; return max; } int main() { int a[] = {1,3,0,5,-1,-6}; // int a[] = {1,7,0,3,-4,-6}; int len = sizeof (a)/sizeof( int); cout<<longest(a,len)<<endl; return 0; }
很多时候不是我们做不好,而是没有竭尽全力......
分类:
【微软面试100题】
posted on 2014-11-26 20:58 tractorman 阅读(644) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?