1.数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路:可以采用哈希表的方式,最简洁的办法是采用原地交换。

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        /*如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回ture*/
        int len=nums.size();
        for(int i=0;i<len;i++)
        {
            //位置正确,先不用管
            if (i == nums[i])
                continue;
            //出现了重复,直接返回
            if (nums[i] == nums[nums[i]]) {
                return nums[i];
            }
            //交换
            int temp = nums[nums[i]];
            nums[nums[i]] = nums[i];
            nums[i] = temp;
            //这里的i--是为了抵消掉上面的i++,
            //交换之后需要原地再比较
            i--;
        }
        return -1;
    }
};

2.二维数组中的查找

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.size()==0) return false;
        int row=matrix.size();
        int col=matrix[0].size();
        int i=row-1;
        int j=0;
        while(i>=0&&i<row&&j>=0&&j<col)
        {
            if(matrix[i][j]<target)
                j++;
            else if(matrix[i][j]>target)
                i--;
            else
                return true;
        }
        return false;
    }
};

3.替换空格
思路:从后往前替换,string类也具有push_back()的功能。也可以不使用额外的字符串,每当出现一个空格,就把s扩展两个长度,然后从后往前替换。

class Solution {
public:
    string replaceSpace(string s) {
        string res="";
        for(int i=0;i<s.length();i++)
        {
            if(s[i]==' ')
            {
                res.push_back('%');
                res.push_back('2');
                res.push_back('0');
            }
            else
            {
                res.push_back(s[i]);
            }
        }
        return res;
    }
};
class Solution {
public:
    string replaceSpace(string s) {
        int l1 = s.length() - 1;
        for (int i = 0; i <= l1; i++) {
            if (s[i] == ' ') {
                s += "00";
            }
        }//出现空格,提出两个占位符
        int l2 = s.length() - 1;
        if (l2 <= l1) {
            return s;
        }//没有空格的情况
        for (int i = l1; i >= 0; i--) {
            char c = s[i];
            if (c == ' ') {
                s[l2--] = '0';
                s[l2--] = '2';
                s[l2--] = '%';
            } else {
                s[l2--] = c;
            }
        }//从后往前替换
        return s;
    }
};

4.从尾到头打印链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        vector<int> res;
        stack<int> s1;
        if(head==nullptr) return res;
        ListNode* p=head;
        while(p)
        {
            s1.push(p->val);
            p=p->next;
        }
        while(!s1.empty())
        {
            res.push_back(s1.top());
            s1.pop();
        }
        return res;
    }
};

5.重建二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int len=preorder.size();
        if(len==0) return nullptr;
        TreeNode* root=new TreeNode(preorder[0]);
        int gen=0;
        for(int i=0;i<len;i++)
        {
            if(inorder[i]==preorder[0])
            {
                gen=i;
                break;
            }
        }//找出根节点
        vector<int> preLeft,preRight,inLeft,inRight;
        for(int i=0;i<gen;i++)
        {
            preLeft.push_back(preorder[i+1]);
            inLeft.push_back(inorder[i]);
        }//左子树的数组
        for(int i=gen+1;i<len;i++)
        {
            preRight.push_back(preorder[i]);
            inRight.push_back(inorder[i]);

        }//右字数的数组
        root->left=buildTree(preLeft,inLeft);
        root->right=buildTree(preRight,inRight);//递归
        return root;
    }
};