今天三道剑指offer,一道LeetCode。
1.矩形覆盖,昨天跳台阶的另一种问法。
int rectCover(int number) {
if(number<=2)
{
return number;
}
int pre1=1;
int pre2=2;
int res=0;
for(int i=3;i<=number;i++)
{
res=pre1+pre2;
pre1=pre2;
pre2=res;
}
return res;
}
2.二进制中1的个数。
int NumberOf1(int n) {
int count=0;
while(n)
{
count++;
n=n&(n-1);
}
return count;
}
3.调整数组顺序使奇数位于偶数前面。保证数据的稳定性。
从第一个数开始判断,如果是奇数,且前面还有数字,就判断前面的数字是不是奇数,不是,两个位置元素互换,然后再向前判断。碰到奇数停止判断,此时在这个奇数前的数字也都是奇数。
void reOrderArray(vector<int> &array) {
if(array.size()<=1)
{
return;
}
for(int i=0;i<array.size();i++)
{
if(array[i]%2)
{
if(i>0)
{
for(int j=i-1;j>=0;j--)
{
if(array[j]%2)
{
break;
}
else
{
swap(array,j+1,j);
}
}
}
}
}
}
void swap(vector<int> &array,int i,int j)
{
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
4.二叉树后续遍历(递归版)
vector<int> postorderTraversal(TreeNode *root) {
vector<int>res;
if(!root)
{
return res;
}
postorder(root,res);
return res;
}
void postorder(TreeNode *root,vector<int>&res)
{
if(root)
{
postorder(root->left,res);
postorder(root->right,res);
res.push_back(root->val);
}
}