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();
}

京公网安备 11010502036488号