今天笔试题遇到一个买卖点算法问题,假设从第0天到第8天的价格是{ 1,2,9,4,3,6,7,8,6};
那么最佳的买卖点(即第几天)有:
买入0,卖出2
买入4,卖出7
写个算法求出这个过程
#include <iostream>
using namespace std;
int main()
{
int p[] = { 1,2,9,4,3,6,7,8,6};
//int p[] = {6,5,4,3,2,1 };
bool bbuy = false, bsell = false;
int ibuy = 0, isell = 0;
cout << sizeof(p) / sizeof(int) << endl;
for (int i = 0; i < sizeof(p)/sizeof(int); i++)
{
if (p[i] < p[i + 1])
{
if (bbuy == false)
{
bbuy = true;
ibuy = i;
//bsell = false;
}
}
if (p[i] >= p[i + 1])
{
if (bsell == false &&bbuy)
{
bsell = true;
isell = i;
//bbuy = false;
}
}
cout <<i<<"-"<<p[i+1]<<"bbuy:" <<bbuy<<" bsell:" << bsell <<" ibuy"<<ibuy<<" isell:"<<isell<< endl;
if (bbuy&&bsell&&(ibuy < isell))
{
cout << ibuy << "\t" << isell<<"\t"<<p[ibuy]<<"\t"<<p[isell] << endl;
bsell=bbuy = false;
ibuy = isell = 0;
}
}
return 0;
}
算法中并没有考虑到数组越界问题,也能得到正确答案,编译器也没有报错,很奇怪?
考虑到越界问题的话,算法应该是如下:
int main()
{
//cout << 24 % 5 << endl;
//f(13);
int p[] = { 1,2,9,4,3,6,7,8,6,9};
//int p[] = {6,5,4,3,2,1 };
bool bbuy = false, bsell = false;
int ibuy = 0, isell = 0;
int l = sizeof(p) / sizeof(int);
cout << l << endl;
for (auto i = 0; i <= l-1; i++)
{
if (i == l - 2) {
if (p[i] < p[i + 1])
{
if(bbuy==false)
{
bbuy = true;
ibuy = i;
bsell = true;
isell = i + 1;
}
}
if (p[i] >= p[i + 1])
{
if (bbuy)
{
bsell = true;
isell = i;
}
}
}
else if(i<l-2)
{
if (p[i] < p[i + 1])
{
if (bbuy == false)
{
bbuy = true;
ibuy = i;
//bsell = false;
}
}
if (p[i] >= p[i + 1])
{
if (bsell == false &&bbuy)
{
bsell = true;
isell = i;
//bbuy = false;
}
}
}
cout <<i<< "bbuy:" << bbuy << " bsell:" << bsell << " ibuy" << ibuy << " isell:" << isell << endl;
if (bbuy&&bsell)
{
cout << ibuy << "\t" << isell << "\t" << p[ibuy] << "\t" << p[isell] << endl;
bsell = bbuy = false;
ibuy = isell = 0;
}
}
return 0;
}
代码明显冗余了很多,但是没办法。。。