【剑指offer】第六十三题(股票的最大利润) 和 第六十四题(求 1 + 2 + 3 +4 +.......n )

第六十三题:股票的最大利润

题目:

假设把某股票的价格按照先后顺序存储在数组中,请问买该股票一次可能获得的最大利润为多少?例如,一直股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果,我们能在价格为 5 的时候买入,并在价格为 16 的时候卖出,则能收到的最大利润为 11。

解题程序:

#include<iostream>
#include<stdio.h>
using namespace std;

int MaxDiff(int *numbers,int length)
{
    if(numbers == NULL || length<2)
        return -1;
   
    //初始化两个数对中的最大值和最小值
    int min = numbers[0];
    int maxDiff = numbers[1] - min;
    
    for(int i=2;i<length;i++)
    {
        if(numbers[i-1] < min) 
            min = numbers[i-1];

        int currDiff = numbers[i] - min;
        if( currDiff > maxDiff )
            maxDiff = currDiff;
    }
    
    return maxDiff;
}

// 测试用例:

void test()
{
    int numbers[] = {9,11,8,5,7,12,16,14};    
    int length = sizeof(numbers) / sizeof(numbers[0]);
    
    int ret = MaxDiff(numbers,length);
    if( ret == -1 )
    {
        printf("数组不存在或数组元素小于两个\n");
    }
    else
    {
        printf("股票的最大利润是:%d\n",ret);
    }
}

int main(void)
{
    test();

    return 0;
}


第六十四题:求 1 + 2 + 3 +4 +.......n

题目:求 求 1 + 2 + 3 +4 +.......n,要求不能使用乘除法for、while、if、else、switch、case等关键字及条件判断语句(A ? B : C)。

解题程序:

#include<iostream>
#include<stdio.h>
using namespace std;

// 解法一:利用构造函数求解
// 解题思想:通过创建对象来实现对数字的累加,缺点数字不能太大,否则会消耗大量的资源

class Temp 
{
public:
    Temp()
    {
        ++N;
        sum += N;
    }

    static void Rest()
    {
       N = 0;
        sum =0;
    }

    static int GetSum()
    {
       return sum; 
    }
private:
    static int N;
    static int sum;
};

int Temp::N = 0;
int Temp::sum = 0;

int Sum_Solution1(int n)
{
    Temp::Rest();
    Temp *a = new Temp[n];
    delete []a;
    a = NULL;

    return Temp::GetSum();
}

// 测试用例1

void test1()
{
     int n;
    printf("请输入数字 n:\n");
    scanf("%d",&n);
    
    int ret = Sum_Solution1(n);
    printf("1+2+.......+n = %d\n",ret);   

}

// 解法二:利用虚函数求解
// 解题思想:通过虚函数来实现基类是递归函数的出口,派生类实现函数的递归
class A;
A* array[2];

class A
{
public:
    virtual unsigned int Sum(unsigned int n)
    {
        return 0;
    }
};

class B:public A
{
public:    
    virtual unsigned int Sum(unsigned int n)
    {
        return array[!!n]->Sum(n-1)+n;
    }
};

int Sum_Solution2(int n)
{
    A a;
    B b;
    array[0] = &a;
    array[1] = &b;

    int value = array[1]->Sum(n);
    printf("%d\n",value);
    return value;
}

// 测试用例二:

void test2()
{
     int n;
    printf("请输入数字 n:\n");
    scanf("%d",&n);
    
    int ret = Sum_Solution2(n);
    printf("1+2+.......+n = %d\n",ret);   
}

// 解法三: 利用函数指针来求解

typedef unsigned int(*fun)(unsigned int);

// 递归出口
unsigned int Solution3_Teminator(unsigned int n)
{
    return 0;
}

// 递归处理程序
unsigned int Sum_Solution3(unsigned int n)
{
    static fun f[2] = {Solution3_Teminator,Sum_Solution3};

   return n+f[!!n](n-1);
}

// 测试用3:

void test3()
{
    int n;
    printf("请输入数字 n:\n");
    scanf("%d",&n);

    int ret = Sum_Solution3(n);
    printf("1+2+.......+n = %d\n",ret);   

}

// 解法四:利用模板类型求解

template<unsigned int n>struct Sum_Solution4
{
    enum Value{ N = Sum_Solution4<n-1>::N+n }; 
};

template<>struct Sum_Solution4<1>
{
   enum Value { N = 1}; 
};

// 测试用例四:
void test4()
{
    int ret = Sum_Solution4<10>::N;
    printf("1+2+.......+n = %d\n",ret);   
}

int main(void)
{
    test1();
    test2();
    test3();
    test4();
    return 0;
}

测试用例:

猜你喜欢

转载自blog.csdn.net/qq_35396127/article/details/80038676