OJ?

本文深入探讨了跳阶问题及其与斐波那契数列的紧密联系,详细介绍了两种解决方案:常规跳阶问题的递归方法与斐波那契数列的动态规划方法。此外,文章还涉及了数的操作、字符串处理、栈和队列的应用,以及解决实际问题的算法优化策略。
斐波那契 

//---------问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

//类似于斐波那契数列,等效为输出斐波那契第n列。

int jumpFloor(int num)
{
int res;
if(num<1)
return 0;
else if(num<3)
return num;
else
{
res=jumpFloor(num-1)+jumpFloor(num-2);
return res;
}
}
//----------变态跳台阶---------------

//一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 

//直接总结的结果的规律。。。 

int BTjumpFloor(int num)
{
return 1<<--num; //2^(num-1)
}
//-----大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。-------
//递归方法,数值大了超时<20
int Fibonacci1(int n)
{
if(n==0||n==1)
return 1;
else
{
return Fibonacci1(n-1)+Fibonacci1(n-2);
}
    }
//递归之动态规划----
int Fibonacci(int n)
{
int n_1=1,n_2=0;
while(n-->0)
{
n_2=n_2+n_1;
n_1=n_2-n_1;
}
return n_1;
    }

 数的操作

 

//-----------给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方-------------

 

//
double Powera(double base, int exponent)
{
double s=1;
if(s==0)
return 0;
else
{
for(int i=0;i<abs(exponent);i++)
s*=base;
if(exponent>=0)
return s;
else
return 1.0/s;
}
    }
//-------------------------------------------
//---------------判读整数中含有1的个数-------------------
//方法1:将整数中的每一位与1 2 4 6 8 16....按二进制位比较
int  NumberOf1_2jinzhi(int n) 
{
int pos=1;
    int count=0;
    for(int i=0;i<32;i++)
{
        if((n&pos)!=0)
           count++;
           pos=pos<<1;
     }
return count;
}
//方法2:整数%2和整数/2
int numberof1_shangyushu(int num)
{
int count=0;
unsigned int n=num; //有符号自动转换为无符号,自动通过负数用例,简直了
if(n==0)
return 0;
while(n)
{
if((n%2)!=0)
count++;
n=n/2;
}
return count;
}
//方法3:网络版本利用n=n&(n-1)每次减掉1个1
int numberof1_jian1(int n)
{
int count=0;
while(n != 0){
count++;
n=n&(n-1);
}
return count;
}
//--------------------------------------------------

 字符串

//--------------删除空格---------------------------------------------------------------------------------- 

//示例:[a b  c] 
//思路:两个指针i,j。i负责依次检测该位是否为空格,若为空格则i++,否则则将str[i]赋值给str[j++]
//提醒:最后要加'\0'字符串结束标志,否则会将[j,len]集合之间的元素打印
void deleteSpace(char *str, int len)
{
int i,j;
for( i=j=0; i<len; i++)
if(str[i] != ' ')
str[j++] = str[i];
str[j++]='\0';
}
//------------------------------------------------------------------------------

 

//-----将字符串的中的1个空格替换为多个字符像***-------
//思路:通过计算空格个数,计算出替换后的字符串的长度:length+countSpace*所加字符长度。
// 从右往左将非空字符和被加字符放入新长度的字符串
//特点:与删除空格不同的是:删除空格和替换空格均为从左到右,因为字符串长度减小或不变
// 而替换为多个空格则会增加字符串长度,需要从右往左添加。
void replaceSpace(char *str, int length)
{
int cnt_space=0;
int length_then;
for(int i=0; i<length; i++)
str[i]==' '&& cnt_space++;
for(length,length_then=length+cnt_space*2;length>=0;length_then--,length--) //字符或空格均要使两个长度-1
{
if(str[length]!=' ')
str[length_then]=str[length]; //非空格时替换
else
memcpy(&str[length_then -= 2], "%20", 3); //空格时替换
}
}

 栈和队列

//-----滑动窗口的最大值------------------------------

 

//给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
//例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,
//他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: 
//{[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, 
//{2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

//思路:依次取数组当中size个元素取其中的最大值追加到另一个数组。

//注意:不加第一个if判断会出现段错误 

vector<int> maxInWindows(const vector<int>& num, unsigned int size)

 

    {
        vector<int> res; //存放滑动窗口的最大值
int len = num.size();
        if(num.size()>size && size>0) //注意边界值
            for(unsigned int i=0; i<=len-size; i++)
            {
                int maxnum=num[i];
                for(unsigned int j=i; j<i+size; j++) //求滑动窗口元素中的最大值
                {
                    if(num[j]>maxnum)
                        maxnum=num[j];
                }
                res.push_back(maxnum); //放入数组
//cout<<maxnum<<endl;
             }
        return res;
    }

 //--------------------------------------------------

 //---------------用两个栈实现队列的入队出队---------

 

//思想:利用stack<>容器操作。
// 入队列==入栈1
// 出队列==判断栈2是否为空->空:将栈1中的所有元素都pop到栈2 ->将栈2中的元素pop  ->return stack2.top()
//   非空: ->将栈2中的元素pop
stack<int> stack1;
stack<int> stack2;
void push_(int node)
{
stack1.push(node);
}
int pop_()
{
int tmp;
if(stack2.empty())
{
while(!stack2.empty())
{
tmp = stack1.top();
stack2.push(tmp);
stack1.pop();
}
}
tmp = stack2.top();
stack2.pop();
return tmp;
}
//---------------------------------------------------

 

转载于:https://www.cnblogs.com/gjbmxy/p/5073653.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值