斐波那契
//---------问题描述:一只青蛙一次可以跳上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;
}
//---------------------------------------------------