算法题【剑指offer】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tfcy694/article/details/88544348
二维数组中查找

要点:终止条件——跑出边界

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int r=0, c=array[0].size()-1;
        while(r<array.size()&&(c>=0)){
            if(array[r][c]==target)return true;
            else if(array[r][c]>target)c--;
            else r++;
            }
        return false;
    }
};
替换空格

要点:统计字符数量和空格数量。

class Solution {
public:
	void replaceSpace(char *str,int length) {
        if(str == NULL && length <= 0)return;

    /*originalLength 为字符串str的实际长度*/
        int originalLength = 0, numberOfBlank = 0;
        int i = 0;
        while(str[i] != '\0')
        {
            ++ originalLength;
            if(str[i] == ' ') ++ numberOfBlank;
            ++ i;
        }

    /*newLength 为把空格替换成'%20'之后的长度*/
        int newLength = originalLength + numberOfBlank * 2;
        if(newLength > length)return;

        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;
        while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
        {
            if(str[indexOfOriginal] == ' ')
            {
                str[indexOfNew --] = '0';
                str[indexOfNew --] = '2';
                str[indexOfNew --] = '%';
            }
            else str[indexOfNew --] = str[indexOfOriginal];

            -- indexOfOriginal;
        }
	}
};
从尾到头打印链表

要点:栈

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> v;
        if(head==NULL)return v;
        stack<int> s;
        ListNode *t = head;
        while(t!=NULL){
            s.push(t->val);
            t=t->next;
        }
        while(!s.empty()){
            v.push_back(s.top());
            s.pop();
        }
        return v;
    }
};
用栈实现队列

要点:一个栈专门负责push,另一个专门负责pop

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        int n;
        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        n=stack2.top();
        stack2.pop();

        return n;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};
dp入门

要点:跳台阶和拼矩形等价,二者和斐波那契数列略有区别。变态跳台阶同理,将dp表画出来即可找到规律,注意求和之后要加1.

class Solution {
public:
    int Fibonacci(int n) {
        if(n==0)return 0;
        if(n==1)return 1;
        vector<int> v;
        v.push_back(0);
        v.push_back(1);
        for(int i=2;i<=n;i++){
            v.push_back(v[i-1]+v[i-2]);
        }
        return v[n];
    }
};

class Solution {
public:
    int jumpFloor(int number) {
        if(number==0)return 0;
        if(number==1)return 1;
        vector<int> v;
        v.push_back(0);
        v.push_back(1);
        v.push_back(2);
        for(int i=3;i<=number;i++)v.push_back(v[i-1]+v[i-2]);
        return v[number];
    }
};

class Solution {
public:
    int rectCover(int number) {
        if(number==0)return 0;
        if(number==1)return 1;
        vector<int> v;
        v.push_back(0);
        v.push_back(1);
        v.push_back(2);
        for(int i=3;i<=number;i++)v.push_back(v[i-1]+v[i-2]);
        return v[number];
    }
};

class Solution {
public:
    int jumpFloorII(int number) {
        vector<int> v;
        v.push_back(0);
        v.push_back(1);
        for(int i=0; i<number; i++){
            int sum = 0;
            for(int i=0; i<v.size(); i++)sum+=v[i];
            v.push_back(sum+1);
        }
        return v[number];
    }
};
二进制中1的个数

要点:负数取膜得到的还是负数

class Solution {
public:
     int  NumberOf1(int n) {
         int r=0;
         for(int i=0;i<32;i++){
             int tmp=n%2;
             r+=((tmp==0)?0:1);
             n=n>>1;
         }
         return r;
     }
};

猜你喜欢

转载自blog.csdn.net/tfcy694/article/details/88544348