剑指offer 1-10题解

115 阅读1分钟

第一遍没有通过或者没有思路的题目的题目

第一遍成功做出来且自己的做法是最优的题目

剑指 Offer 06. 从尾到头打印链表

  • 用一个栈存值也行
  • 或者用递归来做也可以

剑指 Offer 05. 替换空格

  1. 先遍历一遍字符串找到空格的数量
  2. 用一个双指针从后往前填字符串
class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') count++;
        }
        // 修改 s 长度
        s.resize(len + 2 * count);
        // 倒序遍历修改
        for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
            if (s[i] != ' ')
                s[j] = s[i];
            else {
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            }
        }
        return s;
    }
};

剑指 Offer 09. 用两个栈实现队列

很简单已经复习过了

剑指 Offer 10- I. 斐波那契数列

很简单的一个题目

做出来但还有多种解法/更优秀解法的题目

剑指 Offer 03. 数组中重复的数字

  • 可以用一个哈希数组来做 时间复杂度和空间复杂度都是O(n)O(n)的做法
  • 利用元素总共只有nn个且数组的范围是0n10\sim n-1 用索引匹配来做可以将空间复杂度降到O(1)O(1)
索引匹配
  • 这里一定要用while循环,而不能用for循环,因为我们是从前向后遍历的一定要使当前索引存储的数字等于索引才能继续向后去做 即向后做的时候一定要保证前面的已经处理完成
class Solution {
public:
    int findRepeatNumber(vector<int>& nums) { // 利用所有的数字的范围都在0 - n-1 之间来做
        int  i = 0;
        while (i < nums.size()){
            if(nums[i] == i) {
                i ++ ;
                continue;
            }
            if(nums[i] == nums[nums[i]]) return nums[i];
            swap(nums[i],nums[nums[i]]);
        }
        return 0;
    }
};

剑指 Offer 04. 二维数组中的查找

  • 暴力遍历空间O(1)O(1) 时间O(n2)O(n ^ 2)
  • bfs搜索空间和时间O(n2)O(n ^ 2)
  • 重点从左下角开始搜索或者从右上开始搜索这样就能一次性完成判断
image.png
class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        int i = matrix.size() - 1, j = 0;
        while(i >= 0 && j < matrix[0].size())
        {
            if(matrix[i][j] > target) i--;
            else if(matrix[i][j] < target) j++;
            else return true;
        }
        return false;
    }
};