《剑指offer》第2章 03-15题解

Python版剑指Offer题解 Python版剑指Offer题解 本题解配合leetcode中剑指Offer刷题使用 参考链接:图解算法数据结构 文章目录剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offe 阅读详情

第二章 面试需要的基础知识

1. 数组

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

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 
  • 排序后扫描复杂度O(nlogn)

  • 哈希表,空间复杂度O(n),时间复杂度O(n)

    原地哈希:有的元素多次重复,有的元素确实,使用原地哈希,其中某个正确元素一定在合适位置,那么遍历时每次比较当前元素是否与 合适位置重复,如果没有重复,就把它放到合适位置。

    时间复杂度O(n),空间复杂度O(1)

    int findRepeatNumber(vector<int>& nums) {
        for(int i = 0;i < nums.size(); ++i){//从头到尾扫描
            if(nums[i] == i) continue;//如果nums[i]在合适的位置,继续向前扫描
            else{//如果不在合适位置
                if(nums[i] == nums[ nums[i] ]) return nums[i];//比较当前元素是否与合适位置的元素重复
                else swap(nums[i],nums[nums[i]]);//如果不重复,就把当前元素放到合适位置
            }
        }
        return 0;
    }
变形题:不修改数组找出重复数字
  1. 创建一个长度为n+1的辅助数组,逐一把原数组的元素m复制到新数组对应下标为m的位置,如果该位置已经被修改,那么该数字重复。空间复杂度O(n)。
  2. 二分法:以0 ~ n-1的中点m为界,小于m的数如果超过了m个,则说明前m个数中有重复的,相反则证明后m个数有重复。再以0~m-1为界,继续缩小范围,继续缩小范围,则能找到该重复的数。空间复杂度为O(1),时间复杂度为O(nlogn)。以时间换空间。
剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

现有矩阵 matrix 如下:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。给定 target = 20,返回 false。

**解决一个复杂问题,通过分析简单具体的例子,试图寻找普遍规律。**发现从右上角开始分析作为突破口。

//从右上角遍历,比target小,就向下走,比target大,就往左走
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.empty()) return false;
        int n = matrix.size(),m = matrix[0].size();
        int i = 0,j = m-1;
        while(i < n && j >= 0){
            if(matrix[i][j] == target) return true;
            else if(matrix[i][j] < target){
                ++i;
            }else{
                --j;
            }
        }
        return false;
    }

2. 字符串

每个字符串都以字符‘\0’结尾,所以要注意越界。

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

输入:s = "We are happy."
输出:"We%20are%20happy."
  • 第一种:在原来字符的基础上进行修改,那么就有可能覆盖修改该字符后面的内容。所以需要把空格后面的所有字符都后移2字节。因为每个空格后面的所有字符都要移动,所以时间复杂度是O(n^2)
  • 第二种:创建一个新的足够多的字符串,在新的字符串上进行复制。建立双指针,从后往前,旧指针指向旧字符串末尾,新指针指向新字符串末尾,碰到空格,旧指针-1,新指针-3;碰到字符,将对应字符复制到新字符串处。

是否高度警惕内存覆盖

    string replaceSpace(string str) {
        if(str.empty()) return "";
        int count = 0;//统计空格的个数
        for(auto & s:str){
            if(s == ' ') ++count;
        }
        int last = str.size()-1,newlast = str.size()+2*count-1;//last指向原数组末尾,newlast指向新数组末尾
        string res(newlast+1,'0');
        while(last >= 0){
            if(str[last] == ' '){//如果碰到空格,替换成“%20”
                --last;
                res[newlast--] = '0';
                res[newlast--] = '2';
                res[newlast--] = '%'; 
                continue;
            }
            res[newlast] = str[last];
            --last;
            --newlast;
        }
        return res;
    }

3.链表

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

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

输入:head = [1,3,2]
输出:[2,3,1]
  • 这道题第一反应是反转链表,修改指针指向,但这样子会改变原来链表的结构。

面试中如果打算修改输入的数据,一定要提前询问面试官是否允许修改。

  • 考虑到不能修改原链表结构,采用从头到尾遍历,用栈存储每次遍历结果,最后出栈。

  • 用递归来实现。每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。当链表非常 长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用 栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。

    vector<int> reversePrint(ListNode* head) {
        vector<int> res;
        stack<int> sk;
        if(!head) return res;
        while(head){
            sk.push(head->val);
            head = head->next;
        }
        while(!sk.empty()){
            res.emplace_back(sk.top());
            sk.pop();
        }
        return res;
    }

4.树

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
    3
   / \
  9  20
    /  \
   15   7

前序遍历第一个值3为根节点,将这个节点new出来。在中序遍历中快速找到3的坐标,那么3之前就是左子树的节点,3之后就是右子树的节点,那么分别递归 左子树和右子树 的前序,中序数组范围,为了方便快速找到某个元素在中序遍历中位置,建立hashmap映射元素和坐标的关系。

做了很多遍这个题,但最后return左右子树的范围时还是会犯错。

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty() || inorder.empty() ) return nullptr;
        unordered_map<int,int> hash;
        for(int i = 0;i < inorder.size(); ++i){
            hash[ inorder[i] ] = i;
        }
        return rebuildTree(preorder, hash, 0, preorder.size()-1, 0, inorder.size()-1 );
    }

    TreeNode* rebuildTree(vector<int>& preorder, unordered_map<int,int> &hash, int preStart, int preLast, int inStart, int inLast){
        if(preStart > preLast || inStart > inLast) return nullptr;
        int val = preorder[preStart];//根节点的值
        TreeNode * node = new TreeNode(val);
        int inIndex = hash[val];//中序遍历中根节点的坐标
        int leftlength = inIndex - inStart;//左子树长度
        node->left = rebuildTree(preorder, hash, preStart + 1, preStart + leftlength, inStart, inIndex-1);
        node->right = rebuildTree(preorder, hash,preStart + leftlength + 1, preLast, inIndex + 1, inLast);
        return node;
    }

5.栈和队列

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

两个栈:一个栈输入,作为主要存储,一直push。当需要delete时,另一个栈作为辅助输出,如果输出栈不为空,则删除栈顶元素;如果输出栈为空,则将输入栈全部出栈到输出栈,再删除栈顶元素。注意每次是输出栈全部被delete以后,再将输入栈新一轮的元素压栈。

class CQueue {
private:
    stack<int> input,output;
public:
    CQueue() {}
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        in2out();
        if(output.empty()) return -1;//注意这里需要判断,output为空,return-1
        int res = output.top();
        output.pop();
        return res;
    }
     //将输入栈的全部数据一次弹出,并压入输出栈中,这样子输出栈的顺序就是队列的顺序
    void in2out(){
        if(output.empty()){
            while(!input.empty()){
                int temp = input.top();
                input.pop();
                output.push(temp);
            }
        }
    }
};
变形题:用两个队列实现栈
  • 每次要存入一个元素,先入队1,再把队2中的元素全部出队,并入队1,最后再交换队列1和队列2,这样子队列2中队首元素永远是最新存入的元素。从而实现先入先出。

6.递归和循环

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

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

  • 一开始会考虑递归解法。如下图所示,这棵树有很多节点是重复的,而且重复节点数会随着n的增大急剧增加。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjCwLS6Q-1621498837164)(images/image-20210519145352047.png)]

  • 所以最好是把已经得到的数列中间项保存起来,下次计算的时候先查找一下。类似动态规划中的空间压缩。

        int fib(int n) {
            if(n < 2) return n;
            long long f0 = 0;//前两个状态的值
            long long f1 = 1;//前一个状态的值
            long long fN = 0;//当前状态值
            for(int i = 2;i <= n; ++i){
                fN = (f1 + f0)%1000000007;//当前状态值只与前两个状态有关
                f0 = f1;
                f1 = fN;
            }
            return fN;
        }
    
剑指 Offer 10- II. 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

输入:n = 7
输出:21

到达当前台阶有两种方法,第一种是从上一个台阶跳一个,或者是从上两个台阶跳两个,所以当前台阶的跳法是上一个台阶和上两个台阶跳法之和dp[i] = dp[i-1] + dp[i-2]

/*
    int numWays(int n) {
        if(n < 2) return 1;
        vector<int> dp(n+1,0);//dp[i]表示当前第i级台阶总共有多少种跳法
        dp[0] = 1;//0阶台阶有1种跳法
        dp[1] = 1;//1阶台阶有一种跳法
        for(int i = 2;i <= n;++i){
            dp[i] = (dp[i-1] + dp[i-2])%1000000007;
        }
        return dp[n];
    }
    */
    //类似斐波那契,进行空间降压缩
    int numWays(int n){
        if(n < 2) return 1;
        int step0 = 1,step1 = 1,stepN = 0;
        for(int i = 2;i <= n; ++i){
            stepN = (step0 + step1)%1000000007;
            step0 = step1;
            step1 = stepN;
        }
        return stepN;
    }
剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

输入:[3,4,5,1,2]
输出:1

在旋转数组里求最小值,最小值应该是旋转的分界线。利用二分法:当前中点,如果它指向的值小于等于右端,那么右区间是排好序的;反之,那么说明左区间是排好序的。
这个题难点在于:如果数组中存在重复元素,有可能出现中点值==右端值时,无法判断哪个区间是排好序,需单独right–。相当于区间遍历。

    int minArray(vector<int>& numbers) {
        int left = 0, right = numbers.size()-1;
        int minNum = numbers[right];
        while(left <= right){
            int mid = (left + right)/2;
            minNum = min(minNum,numbers[mid]);
            if(numbers[mid] < numbers[right]){//右半段正常顺序,最小值可能在左半段
                right = mid-1;
            }else if(numbers[mid] > numbers[right]){//左半段正常顺序,最小值可能在右半段
                minNum = min(minNum,numbers[left]);
                left = mid+1;
            }else{//如果相等,无法确定哪半段是正常顺序
                --right;
            }
        }
        return minNum;
    }

7.回溯法

剑指offer12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
    bool exist(vector<vector<char>>& board, string word) {
        if(word.empty()) return true;
        if(board.empty() || board[0].empty()) return false;
        int m = board.size(),n = board[0].size();
        vector<vector<bool>> visited(m, vector<bool>(n,false));//falg标志每个字符是否作为单词的一部分
        bool isFind = false;
        for(int i = 0; i < m; ++i){
            for(int j = 0; j < n; ++j){
                traceBack(board, word, visited, 0, i, j, isFind);
                if(isFind) return true;
            }
        }
        return false;
    }
    void traceBack(vector<vector<char>>& board, string &word, vector<vector<bool>> &visited, int pos, int i, int j, bool & isFind){
        if(i < 0 || i >= board.size() || j < 0 || j >= board[0].size()) return;//如果越界,返回
        if(visited[i][j] || isFind || board[i][j] != word[pos]) return;//访问过的,或已经找到了,或当前查找不匹配的,返回
        if(pos == word.size()-1){//当前查找字符 刚好为 最后一个匹配,表示找到该单词
            isFind = true;
            return;
        }
        visited[i][j] = true;
        traceBack(board, word, visited, pos + 1, i - 1, j, isFind);//上
        traceBack(board, word, visited, pos + 1, i + 1, j, isFind);//下
        traceBack(board, word, visited, pos + 1, i, j - 1, isFind);//左
        traceBack(board, word, visited, pos + 1, i, j + 1, isFind);//右
        visited[i][j] = false;//回溯修改状态
    }
剑指 Offer 13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

输入:m = 2, n = 3, k = 1
输出:3

根据数位和增量公式得知,数位和每逢 进位 突变一次。根据此特点,矩阵中 满足数位和的解 构成的几何形状形如多个 等腰直角三角形,由于机器人一次只能走一步,而三角形之间不一定是联通的,因此机器人不一定能够到达所有满足数位的点。由于不可达解的存在,不能直接遍历统计多个三角形的面积。

机器人从坐标(0,0)开始,当准备进入坐标(i,j)时,先判断是否越界,或已经访问过,或不满足数位,如果不能进入,返回0,面积无变化;如果可以进入,修改已经访问该点,并对相邻的其他四个方向进行搜索,且面积+1。

    int movingCount(int m, int n, int k) {
        if(!k) return 1;
        vector<vector<bool>> visited(m,vector<bool>(n,false));//是否已经到达
        return traceBack(visited, 0, 0, k);
    }
    int traceBack(vector<vector<bool>> & visited, int i, int j, int &k){
        if(i < 0 || i >= visited.size() || j < 0 || j >= visited[0].size() || visited[i][j] || getSum(i) + getSum(j) > k) return 0;
        //越界,已经访问过,和大于k,return 0
        visited[i][j] = true;//把已经访问过的修改为true
        return 1 + traceBack(visited, i - 1, j, k) + traceBack(visited, i + 1, j, k) + traceBack(visited, i, j - 1, k) + traceBack(visited, i, j + 1, k);
    }
    int getSum(int num){//计算某个数各个位之和
        int sum = 0;
        while(num){
            sum += num%10;
            num /= 10;
        }
        return sum;
    }

8.动态规划与贪婪算法

剑指 Offer 14- I. 剪绳子

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

这里的dp[1],dp[2],dp[4]不是真正长度为1,2,3以后被剪的最优解,由于是乘积,乘1相当于无效,所以给前三个状态提前存好初始值。dp[4] = max(1*3 , 2*2 , 3*1) = 4``dp[5] = max(1*4, 2*3 = = 6即dp[n] = max(dp[i] * dp[n-i])

    int cuttingRope(int n) {
        if(n < 2) return 0;//如果绳子长为0,1,最大乘积为0
        if(n <= 3) return n-1;//如果绳子长为2,乘积为1;长为3,乘积为2
        vector<int> dp(n+1,0);//长度为i的绳子被剪以后的最优解
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 3;
        for(int i = 4; i <= n; ++i){
            for(int j = 1; j <= i/2; ++j){
                dp[i] = max(dp[i], dp[j] * dp[i-j]);
            }
        }
        return dp[n];
    }
剑指 Offer 14- II. 剪绳子 II

使用贪心算法解决上题:绳子长度>=5时,剪成长度为3的每小段;绳子长度==4,剪成长度为2的两小段。

    int cuttingRope(int n) {
        if(n < 2) return 0;
        if(n <= 3) return n-1;
        long res = 1;
        while(n>4){//当绳子长度>4的时候多全部剪成3d
           res = ( res * 3 )%1000000007;
           n -= 3;
        }
        return ( res*n) %1000000007;
    }

9.位运算

剑指 Offer 15. 二进制中1的个数

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

输入:00000000000000000000000000001011
输出:3

右移运算时。如果数字是无符号数,则用0填补高位;如果是有符号数,则用符号位填补高位。例如数字原先是负数,右移之后在左边补n个0。

/*注意:把n右移,与1做&运算,可能会导致死循环,因为无符号数右移,高位补0,但如果是负数,右移后,高位补1;
方法1:所以此题应该是把1左移,直到左移32次以后,变成0
    int hammingWeight(uint32_t n) {
        int count = 0;
        uint32_t flag = 1;
        while(flag){
            if( n&flag ) ++count;
            flag <<= 1;
        }
        return count;
    }*/
/*方法1中无论有几个1,都要运行32次。
方法2:整数中有几个1就运行几次。
把一个整数减1,再和原整数做与运算,会把原整数最右侧的1变成0,那么一个二进制数有几个1就可以做几次这个运算。
*/
    int hammingWeight(uint32_t n) {
        int count = 0;
        while(n){
            ++count;
            n = (n-1)&n;
        }
        return count;
    }
ESXI 与 OPNSense 配合 国庆期间在家里更新曾经购买的设备,将曾经的单系统,加固为防火墙,多系统的网络架构,如下图: 网络架构 在 ESXI 系统中默认存在一个 vSwitch0 交换机,且其不能被修改名称,因此在此通过修改其对应绑定的上行网卡即可,具体如下: 设置 vSwitch0 上行链路 将 vmnic 0 (网口... 阅读详情

相关推荐

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

腾讯面试题,如何寻找一个数组里面唯一不重复的元素?要求时间复杂度o(n)和空间复杂度o(1)

找出不重复的数 题目描述: 有一组存放 ID 的数据。并且 ID 取值为 0 - (N-1) 之间,其中只有一个 ID 出现的次数为 1,其他的 ID 出现的次数都等于 2,问如何找到这个次数为 1 的 ID ?       解法一:巧用数组下标       我的第一想法便是...

dreamispossible的博客 2775

《剑指Offer》第二章

第一题:赋值运算符 class MyString { public: MyString(char *data = NULL); MyString(const MyString &str); ~MyString() private: char *m_pData; };注意点:返回值类型、参数类型、证同处理、内存泄漏 MyString& operator=(cons

xufeilong520xu的专栏 288

欧姆龙多PLC串行链接模式的应用

欧姆龙多PLC串行链接模式的应用 一、如何将两台CP1H进行串行PLC连接(PLC串行链接) 主机侧设定 从机侧设定 二、 如何实现编程通信 主机侧的【PC连接模式】为【全部】的时候 ① 主机会把自己的地址从3100开始,按照【链接字】设定的字数个数发送到每个从机的3100开始进行存储。 ② 从机会把自己的地址从31n0开始,按照主机侧参数【链接字】设定的字数个数发送到主机的31n0开始进行存储。 注:(n为从机的地址号,若从机号不连续,则该编号的地址将不被定义..

u014202847的博客 3081

部署资源管理系统chemx

资源管理系统的部署教程

weixin_40784215的博客 822

剑指offer——第二章

一、编程语言 1.C++概念理解题 面试官:定义一个空的类型,里面没有任何成员变量和成员函数。对该类型求sizeof,得到的结果是多少? 应聘者:答案是1 面试官:为什么不是0? 应聘者:空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例.至于占用多少内存,由编译器决定。在VisuaI studio中,...

苹果果的博客 218

SHAP图全解析:从理论到实践,教你如何读懂和优化模型特征

本文全面解析SHAP图,从博弈论基础到实战应用,指导读者如何解读和利用SHAP值优化机器学习模型。通过详解特征重要性条形图、小提琴图、依赖图及决策图等关键可视化工具,帮助数据科学家精准诊断模型、识别特征交互,并将洞见转化为特征工程与模型调试的实际行动,有效提升模型可解释性与性能。

svm4gardener的博客 187

剑指offer第二章

2.2.2 c++中struct 与 class 的区别  : 如果没有表明成员函数或者成员变量的访问权限级别,那么在struct中默认的是public,在class中默认的是private。          衍生知识:  三种访问控制权限 访问权限 public protected private 对本类 可见 可见 可见 对子类 ...

cloudyfei的博客 149

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 420

获取抖音中x-secsdk-csrf-token的方法

获取抖音中x-secsdk-csrf-token的方法

sh_moranliunian的博客 2016

[剑指offer] JAVA版题解(完整版)

本文首发于我的个人博客:尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二...

尾尾部落 6万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

刷题——[剑指 offer] JAVA 版题解

序号 题解 牛客 OJ 数据结构类型 03 [剑指 offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指 offer] 替换空格 替换空格 字符串 05 [剑指 offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指 offer] 重建二叉树 重建二叉树 ...

程序员世杰 2296

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【目录】LeetCode《剑指Offer》java题解分类汇总

1.链表 1.剑指Offer06从头到尾打印链表java题解 2.剑指 Offer 18. 删除链表的节点java题解 3.剑指 Offer 22. 链表中倒数第k个节点java题解 4.剑指 Offer 24. 反转链表Java题解 5.剑指 Offer 25. 合并两个排序的链表Java题解 6.剑指 Offer 35. 复杂链表的复制java题解 7.剑指 Offer 36. 二叉搜索树与双向链表java题解 8.剑指 Offer 52. 两个链表的第一个公共节点java题解 2.树 1.剑指 Off

乾坤未定,你我皆是黑马 1109

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode剑指offer题目分类汇总及题解

LeetCode剑指offer的分类总结,可以作为刷题指南和题解,方便刷题和汇总

艾醒的博客 1934

剑指 Offer(第 2 版)

目录剑指 Offer 03. 数组中重复的数字题目介绍题目实现剑指 Offer 04. 二维数组中的查找题目介绍[240. 搜索二维矩阵 II](https://leetcode-cn.com/problems/search-a-2d-matrix-ii/)题目实现剑指 Offer 05. 替换空格题目介绍题目实现剑指 Offer 06. 从尾到头打印链表题目介绍题目实现剑指 Offer 07. 重建二叉树题目介绍[105. 从前序与中序遍历序列构造二叉树](https://leetcode-cn.com/

轻松的小希 3149

牛客网剑指offer java 全部题解

经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助。 每天一道剑指offer-二维数组中的查找 https://mp.weixin.qq.com/s?__biz=MzI5MzYzMDAwNw==&amp;mid=2247484262&amp;idx=2&amp;sn=83fb17...

WantFlyDaCheng的博客 1568

剑指Offer题解——数组

文章目录剑指 Offer 03. 数组中重复的数字解法剑指 Offer 04. 二维数组中的查找解法剑指 Offer 29. 顺时针打印矩阵解法剑指 Offer 53 - I. 在排序数组中查找数字 I解法剑指 Offer 53 - II. 0~n-1中缺失的数字解法推荐阅读 剑指 Offer 03. 数组中重复的数字 力扣链接 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请

wardseptember的博客 670

剑指offer题型汇总及个人建议

目录考点分类难度分类全部题解链接建议感想 考点分类 我自己的理解,不喜勿喷。 链表: 二叉树: 排序: 搜索: 数学逻辑: 字符串: 数组: 难度分类 本身牛客网的难度等级我感觉其实不是很合理,有时候他标的难题反而简单,中等题反而会卡我好久,下面是我列出来的难度分类。不喜勿喷。 简单: 中等: 较难: 困难: 全部题解链接 剑指offer(01-03)题解 剑指offer(04-06)题解 剑指offer(07-09)题解 剑指offer(10-12)题解 剑指offer(13-15)题解 剑指offer(

lovely__RR的博客 1605

算法题解(剑指Offer篇)

文章目录栈与队列(简单)*剑指 Offer 09. 用两个栈实现队列 - 12.27剑指 Offer 30. 包含min函数的栈 - 12.27链表(简单)*剑指 Offer 06. 从尾到头打印链表 - 12.28剑指 Offer 24. 反转链表 - 12.28剑指 Offer 35. 复杂链表的复制 - 12.28 栈与队列(简单) *剑指 Offer 09. 用两个栈实现队列 - 12.27 剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 app

x-dragon8899的博客 1463

【剑指Offer】Java题解汇总

【剑指Offer】Java题解汇总01. 数组中重复的数字02. 二维数组中的查找03. 替换空格04. 从尾到头打印链表05. 重建二叉树06. 用两个栈实现队列07. 斐波那契数列08. 青蛙跳台阶问题09. 旋转数组的最小数字10. 矩阵中的路径11. 机器人的运动范围12. 剪绳子<动态规划>13. 剪绳子<贪心算法,大数取余>14. 二进制中1的个数15. 数值的整数次方16. 打印从1到最大的n位数(大数问题)17. 删除链表的节点18. 正则表达式匹配(Hard)19.

Lujiahao98689的博客 580

[剑指offer] JAVA版题解(全)

序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二叉树 重建二叉树 树 07 [剑指offer] 用两个栈实现队列 用...

尾尾部落 1375

【C++】leetcode力扣 剑指 Offer 题解

文章预览:剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offer 12. 矩阵中的路径剑指 Offer 13. 机器人的运动范围剑指 Offer 14- I. 剪绳子剑指 Of

qq_43050258的博客 2056

【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer] [剑指offer][JAVA]面试题第[06]题[从尾到头打印链表][栈][递归] [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList] [剑指offer][JAVA]面试题第

dadongwudi的博客 726

剑指Offer三天挑战赛03~15

剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:输出:2 或 3限制:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-z著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2401_85767533的博客 639
上一篇: B站杜老师数据库课堂笔记day03
下一篇: 《剑指offer》第三章 16-26题解
Netfishless
博客等级 码龄9年 3640粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值