java经典算法题

2023-11-11

目录

1.Java多线程:写一下两个线程交替打印 0~100 的奇偶数

2.线程安全的单例模式

3.用两个栈实现队列

4.实现单链表反转操作

5.Java实现二分查找

6.冒泡排序

7.快速排序

快速排序的基本思想:

8.Java单链表实现快速排序

9.二叉树的前序遍历

10.二叉树的中序遍历

11.二叉树的后序遍历

12.java实现逆波兰表达式

13.斐波那契数列及青蛙跳台阶问题


1.Java多线程:写一下两个线程交替打印 0~100 的奇偶数

这种实现方式的原理就是线程1打印之后唤醒其他线程,然后让出锁,自己进入休眠状态。因为进入了休眠状态就不会与其他线程抢锁,此时只有线程2在获取锁,所以线程2必然会拿到锁。线程2以同样的逻辑执行,唤醒线程1并让出自己持有的锁,自己进入休眠状态。这样来来回回,持续执行直到任务完成。就达到了两个线程交替获取锁的效果了。

private int count = 0;
private final Object lock = new Object();

public void turning() throws InterruptedException {
   Thread even = new Thread(() -> {
       while (count <= 100) {
           synchronized (lock) {
               System.out.println("偶数: " + count++);
               lock.notifyAll();
               try {
               	   // 如果还没有结束,则让出当前的锁并休眠
                   if (count <= 100) {
                       lock.wait();
                   }
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   });
   Thread odd = new Thread(() -> {
       while (count <= 100) {
           synchronized (lock) {
               System.out.println("奇数: " + count++);
               lock.notifyAll();
               try {
                   // 如果还没有结束,则让出当前的锁并休眠
                   if (count <= 100) {
                       lock.wait();
                   }
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   });
   even.start();
   // 确保偶数线程线先获取到锁
   Thread.sleep(1);
   odd.start();
}

2.线程安全的单例模式

双锁判断机制创建单例模式

public class DoubleCheckLockSinglenon {
 
    private static volatile DoubleCheckLockSinglenon doubleCheckLockSingleon = null;
 
    public DoubleCheckLockSinglenon(){}
 
 
 
    public static DoubleCheckLockSinglenon getInstance(){
        if (null == doubleCheckLockSingleon) {
            synchronized(DoubleCheckLockSinglenon.class){
                if(null == doubleCheckLockSingleon){
                    doubleCheckLockSingleon = new DoubleCheckLockSinglenon();
                }
            }
        }
        return doubleCheckLockSingleon;
    }
 
 
    public static void main(String[] args) {
        System.out.println(DoubleCheckLockSinglenon.getInstance());
 
    }
 
}

3.用两个栈实现队列

题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

解题思路
两个栈stack1和stack2 。
开始时,每次添加队尾元素到stack1中。
如果需要弹出队头元素,则将stack1中的元素弹出并push到stack2中,再将stack2的栈顶元素弹出,即为弹出了队头元素。
如果stack2中是非空的,再在队尾中添加元素的时候仍然加到stack1中,从stack2中弹出队头元素。
只有当stack2为空的时候,弹出队头元素才需要将stack1中的元素转移到stack2中。

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if(stack2.size() == 0) {
            while(!stack1.isEmpty()) {
                int temp = stack1.peek();
                stack2.push(temp);
                stack1.pop();
            }
        }
        int res = stack2.peek();
        stack2.pop();
        return res;
    }
}

4.实现单链表反转操作

 单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据。二是指针域,用于存储下一个节点的地址。在Java中定义如下:

public class Node {
    
    private Object data;//数据域
    private Node next;//指针域
 
    public Node(Object data){
        this.data = data;
    }
 
    public Node(Object data,Node next){
        this.data = data;
        this.next = next;
    }
 
    public Object getData() {
        return data;
    }
 
    public void setData(Object data) {
        this.data = data;
    }
 
    public Node getNext() {
        return next;
    }
 
    public void setNext(Node next) {
        this.next = next;
    }
 
}

先说下思路:所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。但由于单链表没有指向前一个节点的指针域,因此我们需要增加一个指向前一个节点的指针pre,用于存储每一个节点的前一个节点。此外,还需要定义一个保存当前节点的指针cur,以及下一个节点的next。定义好这三个指针后,遍历单链表,将当前节点的指针域指向前一个节点,之后将定义三个指针往后移动,直至遍历到最后一个节点停止。
 

public static Node reverseListNode(Node head){
        //单链表为空或只有一个节点,直接返回原单链表
        if (head == null || head.getNext() == null){
            return head;
        }
        //前一个节点指针
        Node preNode = null;
        //当前节点指针
        Node curNode = head;
        //下一个节点指针
        Node nextNode = null;
 
        while (curNode != null){
            nextNode = curNode.getNext();//nextNode 指向下一个节点
            curNode.setNext(preNode);//将当前节点next域指向前一个节点
            preNode = curNode;//preNode 指针向后移动
            curNode = nextNode;//curNode指针向后移动
        }
 
        return preNode;
    }

5.Java实现二分查找

二分查找又称折半查找,查找效率不错

适用场景:顺序存储结构且按有序排列,这也是它的缺点。

    /*
     *递归实现二分算法
     */
    public static int binSearch_2(int key,int[] array,int low,int high){
        //防越界
        if (key < array[low] || key > array[high] || low > high) {
            return -1;
        }
        int middle = (low+high)/2;
        if(array[middle]>key){
            //大于关键字
            return  binSearch_2(key,array,low,middle-1);
        }else if(array[middle]<key){
            //小于关键字
            return binSearch_2(key,array,middle+1,high);
        }else{
            return array[middle];
        }
    }

6.冒泡排序

N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即

/*
 * 冒泡排序
 */
public class BubbleSort {
  public static void main(String[] args) {
    int[] arr={6,3,8,2,9,1};
    System.out.println("排序前数组为:");
    for(int num:arr){
      System.out.print(num+" ");
    }
    for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
      for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
        if(arr[j]>arr[j+1]){
          int temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    } 
    System.out.println();
    System.out.println("排序后的数组为:");
     for(int num:arr){
       System.out.print(num+" ");
     } 
  }
 }

用时间复杂度来说:

  1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

  2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

冒泡排序的最坏时间复杂度为:O(n2) 。

综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

7.快速排序

快速排序的基本思想:

1). 先从数列中取出一个数作为基准数。
2). 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3). 再对左右区间重复第二步,直到各区间只有一个数。
public class Main {
    //快排实现方法
    public static void quickRow(int[] array,int low,int high) {
        int i,j,pivot;
        //结束条件
        if(low >= high) {
            return;
        }
        i = low;
        j = high;
        //选择的节点,这里选择的数组的第一数作为节点
        pivot = array[low];
        while(i<j) {
            //从右往左找比节点小的数,循环结束要么找到了,要么i=j
            while(array[j] >= pivot && i<j) {
                j--;
            }
            //从左往右找比节点大的数,循环结束要么找到了,要么i=j
            while(array[i] <= pivot && i<j) {
                i++;
            }
            //如果i!=j说明都找到了,就交换这两个数
            if(i<j) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        //i==j一轮循环结束,交换节点的数和相遇点的数
        array[low] = array[i];
        array[i] = pivot;
        //数组“分两半”,再重复上面的操作
        quickRow(array,low,i-1);
        quickRow(array,i+1,high);
    }
    public static void main(String[] args) {
        int[] array = {6,17,38,59,2,10};
        int low = 0,high = array.length-1;
        quickRow(array,low,high);
        for (int i : array){
            System.out.println(i);
        }
    }
}

8.Java单链表实现快速排序

单链表的实现为:
(1)使第一个节点为中心点
(2)创建2个指针(p,q),p指向头结点,q指向p的下一个节点
(3)q开始遍历,如果发现q的值比中心点的值小,则此时p=p->next,并且执行当前p的值和q的值交换,q遍历到链表尾即可
(4)把头结点的值和p的值执行交换。此时p节点为中心点,并且完成1轮快排
(5)使用递归的方法即可完成排序

public static void main(String[] args) {
        ListNode head = new ListNode(2);
        ListNode l1 = new ListNode(2);
        ListNode l2 = new ListNode(5);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(8);
        ListNode l5 = new ListNode(4);
        ListNode l6 = new ListNode(2);
        ListNode l7 = new ListNode(1);

        /*ListNode p = l1;
        System.out.println(p.equals(head));
        System.out.println(p == head);*/

        head.next = l1;
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = l7;
        l7.next = null;

        ListNode p = head;
        while (p.next != null) {
            System.out.print(p.val);
            p = p.next;
        }
        System.out.print(p.val);
        System.out.println();

        ListNode begin = head, end = p;
        new SingleLinkedListSorting().quickSort(begin, end);

        p = head;
        while (p != null) {
            System.out.print(p.val);
            p = p.next;
        }
}

public void quickSort(ListNode begin, ListNode end) {
        //判断为空,判断是不是只有一个节点
        if (begin == null || end == null || begin == end)
            return;
        //从第一个节点和第一个节点的后面一个几点
        ListNode first = begin;
        ListNode second = begin.next;

        int nMidValue = begin.val;
        //结束条件,second到最后了
        while (second != end.next && second != null) {
            if (second.val < nMidValue) {
                first = first.next;
                //判断一下,避免后面的数比第一个数小,不用换的局面
                if (first != second) {
                    int temp = first.val;
                    first.val = second.val;
                    second.val = temp;
                }
            }
            second = second.next;
        }
        //判断,有些情况是不用换的,提升性能
        if (begin != first) {
            int temp = begin.val;
            begin.val = first.val;
            first.val = temp;
        }
        //前部分递归
        quickSort(begin, first);
        //后部分递归
        quickSort(first.next, end);
    }

9.二叉树的前序遍历

  前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。

package test;
//前序遍历的递归实现与非递归实现
import java.util.Stack;
public class Test 
{
	public static void main(String[] args)
	{
		TreeNode[] node = new TreeNode[10];//以数组形式生成一棵完全二叉树
		for(int i = 0; i < 10; i++)
		{
			node[i] = new TreeNode(i);
		}
		for(int i = 0; i < 10; i++)
		{
			if(i*2+1 < 10)
				node[i].left = node[i*2+1];
			if(i*2+2 < 10)
				node[i].right = node[i*2+2];
		}
		
		preOrderRe(node[0]);
	}
	
	public static void preOrderRe(TreeNode biTree)
	{//递归实现
		System.out.println(biTree.value);
		TreeNode leftTree = biTree.left;
		if(leftTree != null)
		{
			preOrderRe(leftTree);
		}
		TreeNode rightTree = biTree.right;
		if(rightTree != null)
		{
			preOrderRe(rightTree);
		}
	}
	
	public static void preOrder(TreeNode biTree)
	{//非递归实现
		Stack<TreeNode> stack = new Stack<TreeNode>();
		while(biTree != null || !stack.isEmpty())
		{
			while(biTree != null)
			{
				System.out.println(biTree.value);
				stack.push(biTree);
				biTree = biTree.left;
			}
			if(!stack.isEmpty())
			{
				biTree = stack.pop();
				biTree = biTree.right;
			}
		}
	}
}
 
class TreeNode//节点结构
{
	int value;
	TreeNode left;
	TreeNode right;
	
	TreeNode(int value)
	{
		this.value = value;
	}
}
 
 
 

10.二叉树的中序遍历

中序遍历(LDR)是 二叉树遍历的一种,也叫做 中根遍历、中序周游。在二叉树中,先左后根再右。巧记:左根右。

import java.util.Stack;
public class Test 
{
	public static void main(String[] args)
	{
		TreeNode[] node = new TreeNode[10];//以数组形式生成一棵完全二叉树
		for(int i = 0; i < 10; i++)
		{
			node[i] = new TreeNode(i);
		}
		for(int i = 0; i < 10; i++)
		{
			if(i*2+1 < 10)
				node[i].left = node[i*2+1];
			if(i*2+2 < 10)
				node[i].right = node[i*2+2];
		}
		
		midOrderRe(node[0]);
		System.out.println();
		midOrder(node[0]);
	}
	
	public static void midOrderRe(TreeNode biTree)
	{//中序遍历递归实现
		if(biTree == null)
			return;
		else
		{
			midOrderRe(biTree.left);
			System.out.println(biTree.value);
			midOrderRe(biTree.right);
		}
	}
	
	
	public static void midOrder(TreeNode biTree)
	{//中序遍历费递归实现
		Stack<TreeNode> stack = new Stack<TreeNode>();
		while(biTree != null || !stack.isEmpty())
		{
			while(biTree != null)
			{
				stack.push(biTree);
				biTree = biTree.left;
			}
			if(!stack.isEmpty())
			{
				biTree = stack.pop();
				System.out.println(biTree.value);
				biTree = biTree.right;
			}
		}
	}
}
 
class TreeNode//节点结构
{
	int value;
	TreeNode left;
	TreeNode right;
	
	TreeNode(int value)
	{
		this.value = value;
	}
}
 
 
 

11.二叉树的后序遍历

后序遍历(LRD)是 二叉树遍历的一种,也叫做 后根遍历、后序周游,可记做左右根。后序遍历有 递归算法和非递归算法两种。在二叉树中,先左后右再根。巧记:左右根。

import java.util.Stack;
public class Test 
{
	public static void main(String[] args)
	{
		TreeNode[] node = new TreeNode[10];//以数组形式生成一棵完全二叉树
		for(int i = 0; i < 10; i++)
		{
			node[i] = new TreeNode(i);
		}
		for(int i = 0; i < 10; i++)
		{
			if(i*2+1 < 10)
				node[i].left = node[i*2+1];
			if(i*2+2 < 10)
				node[i].right = node[i*2+2];
		}
		
		postOrderRe(node[0]);
		System.out.println("***");
		postOrder(node[0]);
	}
	
	
	
	public static void postOrderRe(TreeNode biTree)
	{//后序遍历递归实现
		if(biTree == null)
			return;
		else
		{
			postOrderRe(biTree.left);
			postOrderRe(biTree.right);
			System.out.println(biTree.value);
		}
	}
	
	public static void postOrder(TreeNode biTree)
	{//后序遍历非递归实现
		 LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
        // 指向上一个被访问的节点
        TreeNode pre = null;
        while(biTree!=null || !stack.isEmpty()){
            // 遍历到左下
            while(biTree!=null){
                stack.push(biTree);
                biTree = biTree.left;
            }
 
            biTree = stack.pop();
            if(biTree.right==null || biTree.right == pre){
                System.out.println(biTree.value);
                pre = biTree;
                // 保证了不会再次遍历已经遍历过的左子树
                biTree= null;
            }else{
                stack.push(biTree);
                biTree= biTree.right;
            }
        }
	}
}
 
class TreeNode//节点结构
{
	int value;
	TreeNode left;
	TreeNode right;
	
	TreeNode(int value)
	{
		this.value = value;
	}
}
 
 

12.java实现逆波兰表达式

逆波兰表达式把运算量写在前面,把算符写在后面。

 private static List<String> sign=new ArrayList<>();

    static {
        sign.add("+");
        sign.add("-");
        sign.add("*");
        sign.add("/");
    }

    public static void main(String[] args) {
        String[] arrs={"2", "1", "+", "3", "*"};
        System.out.println(evalRPN(arrs));  //9

        String[] arrs1={"4", "13", "5", "/", "+"};
        System.out.println(evalRPN(arrs1));  //6

    }

    public static int evalRPN(String[] tokens) {
        Stack<Integer> mathStack=new Stack<>();
        for (int i = 0; i <tokens.length ; i++) {
            String s=tokens[i];
            if(sign.contains(s)){
                Integer sum=0;
                Integer num2=mathStack.pop();
                Integer num1=mathStack.pop();
                if("+".equals(s)){
                    sum=num1+num2;
                }else if("-".equals(s)){
                    sum=num1-num2;
                }else if("*".equals(s)){
                    sum=num1*num2;
                }else if("/".equals(s)){
                    sum=num1/num2;
                }
//                System.out.println(num1+s+num2+"="+sum);
                mathStack.push(sum);
            }else {
                mathStack.push(Integer.parseInt(s));
            }
        }

        return mathStack.pop();
    }

13.斐波那契数列及青蛙跳台阶问题

递归方式:

public int Fibonacci1(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        return Fibonacci1(n-1) + Fibonacci1(n - 2);
    }

非递归:

public int Fibonacci2(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        int i=0;int j=1;
        int res=0;
        for(int x=2;x<=n;x++){
            res =  i+j;
            i=j;
            j=res;
        }
        return res;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java经典算法题 的相关文章

  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • Java - 如何将特殊字符放入字符串中

    Java 似乎有很好的字符串处理能力 尽管如此 我还是遇到了最简单的问题 我需要动态字符串 它们在运行时更改 因此字符串类型不是一个好的选择 因为它们是不可变的 所以我使用字符数组 设置起来有点痛苦 但至少它们是可以修改的 我想创建一个字符
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • Google App Engine with Java - 运行 javac.exe 编译器时出错

    在 Windows XP 上 刚刚下载并解压谷歌应用程序引擎java sdk to C Program Files appengine java sdk 我已经安装了jdk C Program Files Java jdk1 6 0 20
  • Junit maven构建错误(maven-surefire-plugin:2.19.1:测试失败:分叉进程中出现错误)[重复]

    这个问题在这里已经有答案了 我通过引用创建了一个示例 struts 2 项目和 J unit 测试用例link http self learning java tutorial blogspot com au 2015 04 struts2
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • Java 正则表达式 - 字母数字,最多一个连字符,句点或下划线,七个字符长

    我是 Java 正则表达式工具的新手 尽管它们潜力巨大 但我很难完成这项任务 我想编写一个正则表达式来验证遵循以下语法的输入字符串 小写字母和数字的任意组合 仅一个下划线 一个破折号或一个句号 无其他特殊字符 最小长度为 5 我想出了以下解
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将 Observable>> 转换为 Observable>

    我陷入了如何将以下可观察类型转换 转换为我的目标类型的困境 我有以下类型的可观察值 Observable
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • C#多线程(四)——Timer的使用

    1 Timer类的作用是设置一个定时器 定时执行用户指定的
  • typora主题配置:公众号一键排版

    typora是一个非常易用且免费的markdown编辑器 是我最常用的文档编辑器 它支持实时渲染 不用打开两个窗口 源码窗口和预览窗口 真正实现了沉浸式写作 所谓所见即所得 它的界面简洁 操作简单 非常容易上手 这里就不介绍了 本文主要介绍
  • (三)2.自动控制原理 Time domain analysis and correct 二阶系统动能特性

    上面讲完了最简单的一阶系统动态性能指标 下面说说二阶的 1 二阶系统的标准形式 二阶系统的典型结构 由这个图 我们可以轻松算出他的开环传递函数 增益 闭环传递函数和增益 这里不手打了 在写二阶传递函数时 我们一般把它写成首一形 传递函数依然
  • WEB-5-TCP / IP协议

    TCP IP协议 一 应用层 二 传输层 1 UDP 协议 1 协议格式 2 特点 2 TCP 协议 1 协议格式 3 TCP 中的核心机制 1 确认应答机制 2 超时重传机制 3 连接管理机制 4 滑动窗口 5 流量控制 6 拥塞控制 7
  • Source Insight 4.0安装教程(PS:附安装包及卸载重新安装等注意事项)

    目录 一 Source Insight 4 0安装包 二 删除配置文件 初次安装忽略此步骤 1 清除注册表信息 2 删除全局配置信息 三 安装步骤 1 解压 2 安装 3 替换 4 破解 5 安装提示unable to open or cr
  • windows10 中英文切换状态无法显示解决办法

    菜鸟的电脑很早之前就有这个中英文状态无法显示的毛病 菜鸟一只想解决 但是没有去弄 前几天 菜鸟发现下载一个其他输入法 电脑自带的输入法的中英文切换就会自己出来 但是好景不长 这是治标不治本 今天菜鸟电脑又显示不出来中英文切换了 于是上网搜索
  • STM32程序死在HardFault_Handler的分析和解决

    最近开发STM32F070F6P6项目 发现程序老是运行不了 仿真发现 程序总是死在HardFault Handler 程序总是死在第二个初始化函数里面 上网查询资料发现 STM32出现HardFault Handler故障的原因主要有两个
  • 中国的互联网技术有多牛逼?

    中国的电商 网约车 共享单车 外卖等都居于全球第一 物流配送效率全球第一 表面上看起来这些都是互联网技术 在全球居于领先地位 然而古怪的是至今为止中国互联网唯一走向世界的只有Tik Tok 在中国以外的市场 互联网还是由谷歌 亚马逊等美国企
  • Web自动化测试流程:从入门到精通,帮你成为测试专家!

    Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具是很重
  • 如何生成1亿个手机号码?Python来教你。真实的面试题哦。

    案例解析 最近在网上看到一个python的面试题目 如何用Python生成1亿个手机号码 我第一眼看到的时候心想 这个还不简单 直接 random randint 1 999999999999 就完事了 但是马上就发现了这其中的错误 这个是
  • sql注入系列之Sqli-labs(less-8)

    判断注入点 http 192 168 81 210 sqli Less 8 id 1 id等于1的时候正常id等于1 的时候页面有改变 因此可以判断可能存在注入 并且是布尔型盲注 判断注入类型 输入1 and 1 1和1 and 1 2发现
  • MySQL字符串截取:左截取、右截取、按关键字截取

    1 从左开始截取字符串 语法 SELECT LEFT str len str 被截取的字符串 len 截取长度 示例 SELECT LEFT TF 8220210412003 1 10 结果为 TF 8220210 2 从右开始截取字符串
  • python使用matplotlib创建三维图时隐藏坐标轴、网格、背景的方法

    使用下面的代码创建一条空间直线 import numpy as np import matplotlib pyplot as plt 创建一个空白画布 fig plt figure 创建一个子图 ax fig add subplot pro
  • [-] \Navicat-Cracker NavicatCrackerDlg.cpp:463 ->Please Patch first Or Specified RSA private key

    报错信息 Navicat Cracker NavicatCrackerDlg cpp 463 gt hinese Can t Generate Activation Code Keygen HINT Please Patch first O
  • 【Mo 人工智能技术博客】文本挖掘之LDA主题模型

    文本挖掘之LDA主题模型 作者 郑培 引言 主题模型是文本挖掘的重要工具 近年来在工业界和学术界都获得了非常多的关注 在文本挖掘领域 大量的数据都是非结构化的 很难从信息中直接获取相关和期望的信息 一种文本挖掘的方法 主题模型 Topic
  • ReLU,Sigmoid,Tanh,softmax,pipeline【基础知识总结】

    一 ReLU Rectified Linear Activation Function 1 优点 2 缺点 3 补充 1 Leaky ReLUs 2 参数化修正线性单元 PReLU 3 随机纠正线性单元 RReLU 二 Sigmoid 1
  • echarts自适应父级盒子宽度

    这里写自定义目录标题 效果 手动改变窗口大小 echarts实现自动适应父级盒子宽度 1 在vue中安装一个插件element resize detector 这是一个元素调整大小检测器 npm install element resize
  • 微观的C/C++编译执行过程

    前言 相信能看到这篇文章的同学 是对C语言很热爱的人 最开始学习C语言的时候 我们大多数人都是用集成开发环境 VS VC devc 等 当我们把C语言源代码写好了之后 在集成开发工具中这里点一下 哪里点一下 代码就跑起来了 这种快乐的感觉的
  • Linux下node-sass安装失败的解决方法与简单使用

    记录一下安装node sass的过程 关于CSS是不是一门编程语言 这里不讨论 但是它没有变量 语句 函数 反正我觉得他不是编程语言 于是程序员们发明了CSS预处理器 css preprocessor 它是一种专门的编程语言 可以使用你会的
  • java经典算法题

    目录 1 Java多线程 写一下两个线程交替打印 0 100 的奇偶数 2 线程安全的单例模式 3 用两个栈实现队列 4 实现单链表反转操作 5 Java实现二分查找 6 冒泡排序 7 快速排序 快速排序的基本思想 8 Java单链表实现快