1.圆圈中最后剩下的数字
0,1,...,n-1这n个数字排成一个圆圈,从0开始,每次删除圆圈里第m个数字。求出这个圆圈里剩下的最后一个数字。
思路一:用环形链表模拟圆圈:创建一个一共有n个节点的环形链表,然后每次在这个链表中删除的第m个节点。

class Solution {
public:
    int LastRemaining_Solution(int n, int m)
    {
        if(n<1||m<1) return -1;
        list<int> numbers;
        for(int i=0;i<n;i++)
        {
            numbers.push_back(i);
        }
        list<int>::iterator current=numbers.begin();//迭代器
        while(numbers.size()>1)
        {
            for(int i=1;i<m;i++)
            {
                ++current;
                if(current==numbers.end())
                {
                    current=numbers.begin();//形成一个环
                }
            }
            list<int>::iterator next=++current;
            if(next==numbers.end())
            {
                next=numbers.begin();//迭代到尾部时,调到头部
            }
            --current;
            numbers.erase(current);//删除第m个元素
            current=next;//开始新的循环
        }
        return *(current);
    }
};

思路二:数学方法

class Solution {
public:
    int LastRemaining_Solution(int n, int m)
    {
        if(n<1||m<1)
            return -1;
        int last=0;
        for(int i=2;i<=n;i++)
        {
            last=(last+m)%i;//公式
        }
        return last;
    }
};

2.股票的最大利润
(1)假如把某股票的价格按照时间先后顺序存储在数组中,买卖该股票一次可能获得的最大利润是多少。
思路:定义一个min用来记录股票的最低价,再定义一个cur和max来比较每次迭代获益的最大值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len<2) return 0;
        int min=prices[0];
        int res=prices[1]-min;
        for(int i=2;i<len;i++)
        {
            if(prices[i-1]<min)
            {
                min=prices[i-1];//记录i之前最小的股票
            }
            int cur=prices[i]-min;
            res=max(res,cur);
        }
        return max(res,0);
    }
};

(2)给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
思路:依次遍历,相邻做比较,算小利润相加即等于总利润。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len<2) return 0;
        int max=0;
        for(int i=1;i<len;i++)
        {
            if(prices[i]-prices[i-1]>0)
            {
                max+=prices[i]-prices[i-1];//从头开始依次遍历,只要后者大于前者,就买卖一次,多次差和相加等于连续总差和
            }
        }
        return max;       
    }
};

3.求1-n的和,不能使用乘除法,循环,条件、选择语句。
思路一:利用递归与布尔值。

class Solution {
public:
    int Sum_Solution(int n) {
        int sum=n;
        bool t=(n>0)&&(sum+=Sum_Solution(n-1));
        return sum;
    }
};

思路二:利用构造函数求解

class Temp
{
    public:
           Temp(){++N;Sum+=N;}
    static void Reset(){N=0,Sum=0};
    static unsigned int GetSum(){return Sum};
    private:
    static unsigned int N;
    static unsigned int Sum;
};
unsigned int Temp::N=0;
unsigned int Temp::Sum=0;
unsigned int Sum_solution2(unsigned int n)
{
    Temp::Reset();
    Temp*a=new Temp[n];//调用n次构造函数
    delete []a;
    a=nullptr;
    return Temp::GetSum();
}