【刷题笔记/剑指Offer】Part 2 (11-20)

剑指offer刷题详细分析:part11:51题——55题 目录 Number51: Number52: Number53: Number54:字符流中第一个不重复的数字 Number55: 题目54   题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。   输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。 方法1:使用HashMap实现 (不推荐)   分析:最直观的... 阅读详情

11. 二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

这道题没有想出来,参考了大神的解答,理解了:

先附上代码:

 public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }
} 
接下来附上大神的解答:

分析一下代码: 这段小小的代码,很是巧妙。
如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

下面附上一个比较java的解法:

public class Solution {
    public int NumberOf1(int n) {
        int t=0;
            char[]ch=Integer.toBinaryString(n).toCharArray();
            for(int i=0;i<ch.length;i++){
                if(ch[i]=='1'){
                    t++;
                }
            }
            return t;
    }
}


12. 数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

这个题目考察的是程序的完备性,注意到有以下几种情况需要考虑:

1. 底为 0 的情况

这种情况下,还要分成

                                     1. 0 的 0 次方等于 1(不过我在网上查的是无意义,所以初次编写的时候输出 -1 没有通过所有范例)

                                     2. 0 的 正整数次方为 0

                                     3. 0 的 负数次方为 无意义 输出-1

2. 底不为 0 的情况

这种情况下,还要分成

                                    1. 指数 > 0, 正常计算

                                    2. 指数 = 0, 输出 0

                                    3. 指数 < 0, 输出值的倒数

代码如下:

public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0){
            if(exponent == 0)
                return 1;
            else if(exponent > 0)
                return 0;
            else
                return -1;
        }else {
            if(exponent == 0)
                return 1;
            else if(exponent > 0)
                return PosPower(base, exponent);
            else
                return 1 / PosPower(base, -exponent);
        }
  }
    public double PosPower(double base, int exponent){
        double result = base;
        for(int i = 1; i < exponent; i++)
            result *= base;
        return result;
    }
}

看到了牛客网上大神的代码,佩服佩服:

public class Solution {
     public double Power(double base, int exponent) {
        double result = base;
        int n = exponent;
        if (exponent < 0) {
            exponent = - exponent;
        }
        else if(exponent == 0) {
            return 1;
        }
            for (int i = 1; i < exponent; i++) {
                    result *= base;
            }
         
        return n < 0 ? 1 / result : result;
      }
}

13. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

这个题目主要有两种思路,一种不开辟新空间,采用类似于冒泡算法的方式,使奇数依次冒泡到前面,时间复杂度会比较大。还有种方法是开辟新空间,换取一些时间。我先从前往后遍历 array,奇数放到前面,偶数放到临时栈,最后从后往前存储栈中偶数:

import java.util.Stack;

public class Solution {
    public void reOrderArray(int [] array) {
        Stack<Integer> stack = new Stack();
        int index = 0;
        int i = 0;
        while(i < array.length) {
            if(array[i] % 2 == 1) {
                array[index] = array[i];
                index++;
        	}else{
                stack.push(array[i]);
            }
            i++;
        }
        i--;
        while(!stack.isEmpty()) {
            array[i] = stack.pop();
            i--;
        }
    }
}

14. 链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。
思路是:设置两个指针 front back,都从头开始,先将 front 前移 k-1 次,接下来 front 和 back 同步向前移动直到 front 到了链表尾:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
		if(k <= 0 || head == null)
            return null;
        ListNode front = head;
        ListNode back = head;
        for(; k > 1; k--){
            front = front.next;
            if(front == null)
                return null;
        }
        while(front.next != null) {
            front = front.next;
            back = back.next;
        }
        return back;
    }
}

15. 反转链表

输入一个链表,反转链表后,输出链表的所有元素。

思路1:利用 stack 存储,然后重新赋值,时间复杂度是 O(n):

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public ListNode ReverseList(ListNode head) {
		if(head == null)
            return null;
        Stack<Integer> stack = new Stack();
        ListNode tmp = head;
        while(tmp != null){
            stack.push(tmp.val);
            tmp = tmp.next;
        }
        tmp = head;
        while(tmp != null){
            tmp.val = stack.pop();
            System.out.println(tmp.val);
            tmp = tmp.next;
        }
        return head;
    }
}
思路2:改变指针方向,具体思路参考 【刷题笔记/剑指Offer】Part 1 (1-10) 中的题目二中的2解法:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null)
            return null;
        else if(head.next == null)
            return head;
		ListNode index = head, right = head.next;
        while(right != null) {
            index.next = right.next;
            right.next = head;
            head = right;
            right = index.next;
        }
        ListNode tmp = head;
        while(tmp!=null){
            System.out.println(tmp.val);
            tmp = tmp.next;
        }
        return head;
    }
}

思路3:其实本质上和思路二差不多的,只不过这里要用三个指针:

/*
public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null)
            return null;
        ListNode newHead = null;
        ListNode pNode = head;
        ListNode pPrev = null;
        while(pNode!=null){
            ListNode pNext = pNode.next;
            if(pNext==null)
                newHead = pNode;
            pNode.next = pPrev;
            pPrev = pNode;
            pNode = pNext;
        }
        return newHead;
    }
}

16. 合并两个排序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

本题目可以分为递归和非递归两种解法,需要注意的是我刚开始的思路是不破坏两个链表的结构,则需要新建空间,但是怎么也没法通过,原来牛客网是要不新建空间。下面附上非递归的解法:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        else if(list2 == null)
            return list1;
        ListNode head = null;
        if(list2.val < list1.val){
            head = list2;
			list2 = list2.next;
        }
        else{
            head = list1;
			list1 = list1.next;
        }
        ListNode list = head;
        
        while(list1 != null && list2 != null) {
            if(list2.val < list1.val) {
                list.next = list2;
                list2 = list2.next;
            }else{
                list.next = list1;
                list1 = list1.next;
            }
            list = list.next;
        }
        if(list1 != null){
            list.next = list1;
        }
        if(list2 != null){
            list.next = list2;
        }
        return head;
    }
}

接下来是递归解法:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        else if(list2 == null) 
            return list1;
        ListNode head;
        if(list2.val < list1.val){
            head = list2;
            list2 = list2.next;
        }else{
            head = list1;
            list1 = list1.next;
        }
        head.next = Merge(list1, list2);
        return head;
    }
}

17. 树的子结构

输入两颗二叉树A,B,判断B是不是A的子结构。
这个题目我理解的不够全面,没有考虑到树A中可能会有重复元素的情况,看了大神们的解答后,得出代码如下:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root2 == null)
            return false;
        if(root1 == null)
            return false;
        boolean flag = false;
        if(root1.val == root2.val) {
            flag = isSubtree(root1, root2);
        }
        if(!flag){
            flag = HasSubtree(root1.left, root2);
            if(!flag)
                flag = HasSubtree(root1.right, root2);
        }
        return flag;
    }
    public boolean isSubtree(TreeNode root1, TreeNode root2) {
        if(root2 == null)
            return true;
        if(root1 == null && root2 != null)
            return false;
        if(root1.val == root2.val){
            return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
        }else
	        return false;
    }
}

18. 二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像。

递归实现,so easy:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public void Mirror(TreeNode root) {
        if(root == null)
            return;
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        Mirror(root.left);
        Mirror(root.right);
        return;
    }
}

至于非递归方法,要借助栈实现,注意这里先压入左树还是右树没有关系,但是在遍历的时候就要注意先压入后遍历的子树,最后压入要先遍历的子树,代码如下:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
    
public class Solution {
    public void Mirror(TreeNode root) {
        if(root == null)
            return;
        Stack<TreeNode> stack = new Stack();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode tmp = stack.pop();
            TreeNode swap = tmp.left;
            tmp.left = tmp.right;
            tmp.right = swap;
            if(tmp.right!=null)
                stack.push(tmp.right);
            if(tmp.left!=null)
                stack.push(tmp.left);
        }
    }
}

19. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

画出图后,有了大体的思路,每次遍历了最上面一行矩阵元素后,将剩下的矩阵逆时针转动90°当作新的矩阵,剩下的就是递归直到剩下的矩阵行或列为零。只是这个方法每次都要涉及到申请矩阵空间和矩阵复制,效率没有那么高。看了网上其他人的解答后,恍然大悟,可以将开始结束的范围作为形参传递到递归的下个子函数,这种方法在每次要缩小范围的问题里经常应用,要注意。下面先给出我自己的解答:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> list = new ArrayList<Integer>();
       	assistant(matrix, list);
       	return list;
    }
    public void assistant(int [][] matrix, ArrayList<Integer> list) {
        if(matrix.length == 0 || matrix[0].length == 0)
            return;
        for(int i = 0; i < matrix[0].length; i++) {
            list.add(matrix[0][i]);
    	}
        int [][] tmp = new int[matrix[0].length][matrix.length - 1];
        for(int i = 0; i < matrix.length - 1; i++) {
        	for(int j = 0; j < matrix[0].length; j++)
                tmp[j][i] = matrix[i + 1][matrix[0].length - 1 - j];
        }
        assistant(tmp, list);
        return;
    }
}
接下来是将索引作为形参的方法:

import java.util.*;
 
public class Solution {
     
    public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> result = new ArrayList<Integer>() ;
        if(matrix==null || matrix.length==0) { return result ; }
 
        printMatrixClockWisely(matrix, 0, 0, matrix.length - 1, matrix[0].length - 1, result);
 
        return result ;
    }
     
    public void printMatrixClockWisely(int[][] matrix, int startRow, int startCol, int endRow, int endCol, ArrayList<Integer> result) {
        if(startRow<endRow && startCol<endCol) {
            for(int j=startCol; j<=endCol; j++) { result.add(matrix[startRow][j]) ; }   //Right
            for(int i=startRow+1; i<=endRow-1; i++) { result.add(matrix[i][endCol]) ; }     //Down
            for(int j=endCol; j>=startCol; j--) { result.add(matrix[endRow][j]) ; }     //Left
            for(int i=endRow-1; i>=startRow+1; i--) { result.add(matrix[i][startCol]) ; }   //Up
            printMatrixClockWisely(matrix, startRow + 1, startCol + 1, endRow - 1, endCol - 1, result) ;
        }else if(startRow==endRow && startCol<endCol) {
            for(int j=startCol; j<=endCol; j++) { result.add(matrix[startRow][j]) ; }
        }else if(startRow<endRow && startCol==endCol) {
            for(int i=startRow; i<=endRow; i++) { result.add(matrix[i][endCol]) ; }
        }else if(startRow==endRow && startCol==endCol) {
            result.add(matrix[startRow][startCol]) ;
        }else {
            return ;
        }
    }
     
}

20. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

我最开始的思路是用另一个栈作为辅助栈,存储stack中弹出的元素,在过程中就可以得出min,最后stack的结构不被破坏,当然这种方法比较费空间,看了一下其他人的答案,有用迭代器的,觉得这是个好办法,要好好借鉴一下,下面先附上我的代码:

import java.util.Stack;

public class Solution {
	Stack<Integer> stack = new Stack<Integer>();
    
    public void push(int node) {
        stack.push(node);
    }
    
    public void pop() {
        stack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        Stack<Integer> tmp = new Stack<Integer>();
        int min = top();
        while(!stack.isEmpty()) {
            if(top() < min)
                min = top();
            tmp.push(stack.pop());
        }
        while(!tmp.isEmpty()) 
            push(tmp.pop());
        return min;
    }
}
然后是用迭代器的代码:

import java.util.Stack;
import java.util.Iterator;
 
public class Solution {
 
    Stack<Integer> stack = new Stack<Integer>();
    public void push(int node) {
        stack.push(node);
    }
 
    public void pop() {
        stack.pop();
    }
 
    public int top() {
        return stack.peek();
    }
 
    public int min() {
        int min = stack.peek();
        int tmp = 0;
        Iterator<Integer> iterator = stack.iterator();
        while (iterator.hasNext()){
            tmp = iterator.next();
            if (min>tmp){
                min = tmp;
            }
        }
        return min;
    }
}
当然了,还有的同志直接从轮子开始造起,想一想最基本的几个东西来组成一个栈结构,拿最普通的数组栈来说事儿的话:

1. int[] elements = new int[100];    //初始长度

2. void enLarge()    //当存储元素到达上限时,扩大容量

3. int node    //指向尾部的指针

这样最基本的几个变量已经够了,剩下就是push,pop,top,min等操作啦~


BUCK 电路详解 参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到,使用一个滑动变阻器即可实现降压和稳压的效果。当负载波动时,通过改变滑动变阻器的阻值,可以调节负载所获得的电压。但是使用滑动变阻器的劣势也很明显,大量的耗能会导致器件温度快速升高。 上面所提到的电路主要缺点在于导通器件(变阻器或三极管)本身存在耗能,那么有没有不会耗能的导通器件呢? 阅读详情

相关推荐

[华中科技计组实验]logisim完成单周期5级流水MIPS CPU

[华中科技计组实验]logisim完成单周期5级流水MIPS32 CPU hu~,终于完成了,真是费劲呐 支持24条指令,5级流水线,可以对分支指令处理,寄存器冲突处理,指令ROM为1K,数据RAM为1M,32位MIPS指令集CPU 但是… 大量使用比较器造成硬件开销巨大,测试一下发现这尼玛真是个老爷车还没单周期跑的快,自己电脑cpu占百分之八九十只能跑到20多赫兹,一个走马灯跑了半天,可优化空间太大了,写了那么多天造成这个破样,有点悲剧。。。 先放个图大伙参考就行了,要是有人想听思路的话接下来再更 .

zrc的博客 1万+

《剑指Offer》笔记&题解&思路&技巧&优化_Part_7

🟢1. LCR 179. 查找总价格为目标值的两个商品 🟢2. LCR 180. 文件组合 🟢3. LCR 181. 字符串中的单词反转 🟢4. LCR 182. 动态口令 🔴5. LCR 183. 望远镜中最高的海拔 🟡6. LCR 185. 统计结果概率 🟢7. LCR 186. 文物朝代判断 🟢8. LCR 187. 破冰游戏 🟢8. LCR 187. 破冰游戏 🟡9. LCR 188. 买卖芯片的最佳时机 🟡10. LCR 189. 设计机械累加

这里有一只小马吖 1671

点云直线检测-3DLineDetection复现

点云直线分割-Fast 3D line detection

阁楼 8156

剑指offer刷题详细分析:part3:11题——15题

题目11 二进制中1的个数   题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 方法1:采取每一位与1然后右移的方法(推荐)   说明:使用无符号右移,不管输入的数是正数还是负数,都使用无符号右移,最高位都会补0。如果采用有符号的右移,负数最高位补1,导致while循环陷入死循环。 public static int NumberOf1_1(int n) { ...

LKJgdut的博客 336

Rider高效调试UE引擎:无需编译源码的符号配置指南

本文提供了一份详尽的Rider高效调试UE引擎指南,核心在于无需编译源码即可配置调试符号。通过Epic启动器下载官方PDB文件,并在Rider中正确配置外部符号服务器路径,开发者能在10分钟内实现对引擎内部代码(如AActor::Tick)的源码级断点调试、变量查看和调用堆栈分析,极大提升问题排查效率。

weixin_29011239的博客 341

知识图谱本体建模之RDF、RDFS、OWL详解

(一)知识图谱本体建模之RDF、RDFS、OWL详解 1.语义网体系 知识图谱于2012年由Google提出,并不是新概念,而是由语义网络(Semantic Network)衍生而来。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系。RDF,RDFS与OWL都是基于语义网的知识表示框架,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。RDF,RDFS/OWL 属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。其语义网技术栈如下所示。 2.RD

周周的专栏 1万+

剑指offer刷题详细分析:part1:1题——5题

题目1 二维数组查找   题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。   分析:如下图,我们知道,只能从左下角或者从右上角入手,输入的数大于当前数就往右走,小于当前的数就往上走。   我们从左上角开始遍历,代码如下: public...

LKJgdut的博客 394

【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)

本文针对传统A算法在机器人路径规划中存在的搜索效率低、路径不平滑等问题,提出了一种改进型A算法。该算法通过引入跳点搜索(JPS)技术优化子节点扩展方式,结合贝塞尔曲线或B样条曲线进行路径平滑处理,并采用动态启发式函数和自适应邻域搜索策略,显著提升了路径规划的效率和路径质量。实验结果表明,改进型A*算法在复杂环境下能有效减少搜索节点数量,缩短路径长度,提高路径平滑性,且具备动态避障能力。

2501_92867626的博客 1583

《剑指Offer》笔记&题解&思路&技巧&优化_Part_6

🟡1.LCR 168. 丑数 🟢2. LCR 169. 招式拆解 II 🔴3. LCR 170. 交易逆序对的总数 🟢4. LCR 171. 训练计划 V 🟢5. LCR 172. 统计目标成绩的出现次数 🟢6. LCR 173. 点名 🟢7. LCR 174. 寻找二叉搜索树中的目标节点 🟢8. LCR 175. 计算二叉树的深度 🟢9. LCR 176. 判断是否为平衡二叉树 🟡10. LCR 177. 撞色搭配 🟡11. LCR 178. 训练计划 VI

这里有一只小马吖 1158

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2371

Halcon算子知识:optical_flow_mg

光流(Optical Flow)是一种研究图像对齐的算法,一般包括两大类:稀疏光流和稠密光流。稀疏光流就是研究图像中稀疏点的光流,这些点一般是角点;稠密光流则是研究图像中所有点的偏移量。以下介绍halcon的基本光流算子optical_flow_mg的原理方法。该算子计算两个图片的光流法。 二、算子说明 optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, Integration

gongdiwudu的专栏 1万+

剑指Offer刷题记录 - part two(python版本)

剑指offer刷题11. 两数之和 II - 输入有序数组题目要求解题思路代码12.两数之和 III - 数据结构设计题目要求解题思路代码13.两数之和 IV - 输入 BST题目要求解题思路代码14.三数之和题目要求解题思路代码 11. 两数之和 II - 输入有序数组 题目要求 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所

Liaojiajia-Blog 573

OpenCV实现物体尺寸的测量

物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。

qq_53545309的博客 9160

LeetCode 剑指Offer 数据结构之 递归 总结 Part1

LeetCode 剑指Offer 数据结构之 递归 总结 Part1 递归算法主要应用于树结构的搜索与遍历。其他方面也有一些经典的问题,比如斐波那契数列,跳台阶等,很多问题中动态规划都能替代递归算法。本章将对剑指Offer题库中几道递归算法考题进行总结,记录一些对于递归算法的入门理解,同时简单的与动态规划解法进行一些对比。关于动态规划的部分将在新的文章中进行总结。 递归算法核心在于函数中重复调用本函数,明确终止条件+下一次的函数调用输入(递推公式产生)即可 剑指 Offer 07: 重建二叉树 输入某二叉树

mimazitx的博客 212

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode 剑指Offer 数据结构之 树 总结 Part2

LeetCode 剑指Offer 数据结构之 树 总结 Part2 经典问题 1)遍历 2)树深度 3)重建树 4)对称树 5)子树匹配 6)二叉查找树 遍历问题 补充 DFS(一般采用递归) 深度优先的遍历 在此补充非递归方式的三种遍历 先序遍历: def bin_tree_pre_order_traverse1(root): ''' 利用1个栈实现 ''' res = [] s1 = [] s1.append(root) while s1:

mimazitx的博客 215

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

leetcode 打印_漫画:棒槌指Offer 之 大数打印(百度)

今天是小浩算法 “365刷题计划” 第85天。穿插着为大家分享一道经典面试题目。额外说明的一点是,这道题本身很简单,但是却可以作为很多 中等/困难 题目的基础,比如 超级次方,实现pow(x,n) 等等,在面试时需要额外小心。建议大家掌握!话不多说,直接看题。01PART大数打印本题原始版本出自《剑指offer》,leetcode或许是因为自身原因,并没有很好的进行移植。当然,这道题本身...

weixin_39853155的博客 270

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

剑指offer-算法题练习:part20 二叉树的镜像

剑指offer-算法题练习:part20 二叉树的镜像 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树     8    /  \  6   10  / \   / \ 5 7 9 11 镜像二叉树      8    /    \  10    6   / \    / \ 11 9 7 5 code

梁的博客 645

剑指offer 66题 part4(19~24题)

第十九题:题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.题解:这里要注意的是,这个矩阵不是n*n ,他的行列数可以不相等解题思路:把打印数字当做在这个矩阵中转圈打印,我们很容易计算...

转角的守望 269

剑指offer-算法题练习:part11 二进制中1的个数

剑指offer-算法题练习:part11 二进制中1的个数 时间限制:1秒空间限制:32768K 算法知识视频讲解 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 这段小小的代码,很是巧妙。 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右

梁的博客 716

漫画:棒槌指Offer 之 大数打印(百度)

今天是小浩算法 “365刷题计划” 第85天。穿插着为大家分享一道经典面试题目。额外说明的一点是,这道题本身很简单,但是却可以作为很多 中等/困难 题目的基础,比如 超级次方,实现pow...

Google大神 451

剑指offer-算法题练习:part21 顺时针打印矩阵

剑指offer-算法题练习:part21 顺时针打印矩阵 时间限制:1秒空间限制:32768K 本题知识点: 数组 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10

梁的博客 623

《剑指offer》JZ45扑克牌顺子

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦

FamilyLin 784

数据结构和算法模式

LeetCode Cookbook序 | LeetCode Cookbook 在知乎上看到一篇介绍编程模式的文章,觉得挺不错就学习一下。 原文译文在这里 https://www.jiqizhixin.com/articles/2019-06-12-11 英文原文没有找到,像是给一门课程《Grokking the Coding Interview: Patterns for Coding Questions》打广告。 如果上过刘宇波的算法课、看过剑指offer那么对下面说到的不会太陌生,但有一些基本的操..

ajian005的专栏 239

LeetCode面试题解析:消失的数字的四种解法

在算法面试中,查找缺失数字是考察数组处理和位运算能力的经典问题。通过分析数组特性,可以利用高斯求和公式或异或运算实现O(n)时间复杂度的解法。异或运算凭借其自反性和交换律特性,能够高效定位缺失元素,避免了数学求和的溢出风险。这类算法在数据库记录校验、分布式系统数据完整性检查等场景有重要应用价值。本文以LeetCode面试题17.04为例,详细对比了排序法、哈希表法、数学解法和位运算四种方案,其中位运算以其O(1)空间复杂度和无溢出风险成为最优解,特别适合处理大规模数据场景。掌握这些核心算法思想,不仅能提升面

weixin_33933118的博客 387

【MySQL索引特性】

一个索引对应一个B+树,一张表可以有多个索引就可以有多个B+树; 如果一张表没有主键,mysqld也会使用默认自增长主键创建B+树,目的是方便之后普通索引的建立。

m0_熊猫馆主的博客 1121

【JAVA】堆实现

二叉堆的JAVA实现

不会飞的超人先生的博客 4410
上一篇: 【刷题笔记/剑指Offer】Part 1 (1-10)
下一篇: win10 安装 ubuntu kylin 15 双系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值