【算法数据结构体系篇class03】:数组、链表、栈、队列、递归时间复杂度、哈希表、有序表问题
一、反转链表
package class03;import java.util.ArrayList;
import java.util.List;/*** 链表反转*/
public class ReverseLinkedList {public static class Node {public int value;public Node next;public Node(int data) {value = data;}}public static class DoubleNode {public int value;public DoubleNode last;public DoubleNode next;public DoubleNode(int data) {value = data;}}// head 单链表反转// a -> b -> c -> null// c -> b -> a -> nullpublic static Node reverseLinkedList(Node head) {Node pre = null;Node next = null;while (head != null) {next = head.next;head.next = pre;pre = head;head = next;}return pre;}//双链表反转public static DoubleNode reverseDoubleList(DoubleNode head) {DoubleNode pre = null;DoubleNode next = null;while (head != null) {next = head.next;head.next = pre;head.last = next;pre = head;head = next;}return pre;}//用集合来实现单链表反转,用于进行对比验证public static Node testReverseLinkedList(Node head) {if (head == null) return null;ArrayList<Node> list = new ArrayList<>();while (head != null) {list.add(head);head = head.next;}list.get(0).next = null;for (int i = 1; i < list.size(); i++) {list.get(i).next = list.get(i - 1);}return list.get(list.size() - 1);}//用集合来实现双链表反转,用于对比验证public static DoubleNode testReverseDoubleList(DoubleNode head) {if (head == null) return null;ArrayList<DoubleNode> list = new ArrayList<>();while (head != null) {list.add(head);head = head.next;}list.get(0).next = null;DoubleNode pre = list.get(0);for (int i = 1; i < list.size(); i++) {DoubleNode cur = list.get(i);cur.last = null;cur.next = pre;pre.last = cur;pre = cur;}return list.get(list.size() - 1);}// for test 随机生成单链表public static Node generateRandomLinkedList(int len, int value) {int size = (int) (Math.random() * (len + 1));if (size == 0) return null;Node head = new Node((int) (Math.random() * (value + 1)));Node pre = head;size--;while (size != 0) {Node cur = new Node((int) (Math.random() * (value + 1)));pre.next = cur;pre = cur;size--;}return head;}// for test 随机生成双链表public static DoubleNode generateRandomDoubleList(int len, int value) {int size = (int) (Math.random() * (len + 1));if (size == 0) return null;DoubleNode head = new DoubleNode((int) (Math.random() * (value + 1)));DoubleNode pre = head;size--;while (size != 0) {DoubleNode cur = new DoubleNode((int) (Math.random() * (value + 1)));pre.next = cur;cur.last = pre;pre = cur;size--;}return head;}// for test 集合存储链表节点值public static List<Integer> getLinkedListOriginOrder(Node head) {List<Integer> ans = new ArrayList<>();while (head != null) {ans.add(head.value);head = head.next;}return ans;}// for test 验证链表节点值是否反转成功public static boolean checkLinkedListReverse(List<Integer> origin, Node head) {for (int i = origin.size() - 1; i >= 0; i--) {if (!origin.get(i).equals(head.value)) {return false;}head = head.next;}return true;}// for testpublic static List<Integer> getDoubleListOriginOrder(DoubleNode head) {List<Integer> ans = new ArrayList<>();while (head != null) {ans.add(head.value);head = head.next;}return ans;}// for test 验证双链表节点值是否反转成功public static boolean checkDoubleListReverse(List<Integer> origin, DoubleNode head) {DoubleNode end = null;for (int i = origin.size() - 1; i >= 0; i--) {if (!origin.get(i).equals(head.value)) {return false;}end = head;head = head.next;}for (int i = 0; i < origin.size(); i++) {if (!origin.get(i).equals(end.value)) {return false;}end = end.last;}return true;}// head = removeValue(head, 2); 删除链表中值为2的节点。 1->3->2->2->4->2->5 =》 1->3->4->5public static Node removeValue(Node head, int num) {//head来到第一个不需要删的位置 先确认头节点,排除排前面如果是num 则需一次跳过,比如 2->2->2->2->1->3 需要将新的头节点head指向到1的位置while(head != null){if(head.value != num){break;}head = head.next;}// 1 ) head == null// 2 ) head != nullNode pre =head,cur=head;while (cur != null){if(cur.value ==num){pre.next = cur.next;}else {pre = cur;}cur = cur.next;}return head;}// for testpublic static void main(String[] args) {int len = 50;int value = 100;int testTime = 100000;System.out.println("test begin!");for (int i = 0; i < testTime; i++) {Node node1 = generateRandomLinkedList(len, value);List<Integer> list1 = getLinkedListOriginOrder(node1);node1 = reverseLinkedList(node1);if (!checkLinkedListReverse(list1, node1)) {System.out.println("Oops1!");}Node node2 = generateRandomLinkedList(len, value);List<Integer> list2 = getLinkedListOriginOrder(node2);node2 = testReverseLinkedList(node2);if (!checkLinkedListReverse(list2, node2)) {System.out.println("Oops2!");}DoubleNode node3 = generateRandomDoubleList(len, value);List<Integer> list3 = getDoubleListOriginOrder(node3);node3 = reverseDoubleList(node3);if (!checkDoubleListReverse(list3, node3)) {System.out.println("Oops3!");}DoubleNode node4 = generateRandomDoubleList(len, value);List<Integer> list4 = getDoubleListOriginOrder(node4);node4 = testReverseDoubleList(node4);if (!checkDoubleListReverse(list4, node4)) {System.out.println("Oops4!");}}System.out.println("test finish!");}
}
二、双向链表实现栈和队列
package class03;import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;//双向链表实现队列和栈
public class DoubleEndsQueueToStackAndQueue {public static class Node<T> {public T value;public Node<T> last;public Node<T> next;public Node(T data) {value = data;}}public static class DoubleEndQueue<T> {public Node<T> head;public Node<T> tail;//头端添加节点public void addFromHead(T value) {Node<T> cur = new Node<>(value);if (head == null) {head = cur;tail = cur;} else {cur.next = head;head.last = cur;head = cur;}}//尾端添加节点public void addFromBottom(T value) {Node<T> cur = new Node<>(value);if (head == null) {head = cur;tail = cur;} else {cur.last = tail;tail.next = cur;tail = cur;}}//弹出头端节点public T popFromHead() {if (head == null) {return null;}Node<T> cur = head;if (head == tail) {head = null;tail = null;} else {head = head.next;head.last = null;cur.next = null;}return cur.value;}//弹出尾端节点public T popFromBottom() {if (head == null) {return null;}Node<T> cur = tail;if (head == tail) {head = null;tail = null;} else {tail = tail.last;tail.next = null;cur.last = null;}return cur.value;}//判断是否为空public boolean isEmpty() {return head == null;}}//构建栈结构public static class MyStack<T> {//双向链表结构作为属性private DoubleEndQueue<T> queue;//构造器public MyStack() {queue = new DoubleEndQueue<>();}//入栈public void push(T data) {queue.addFromHead(data);}//出栈public T pop() {return queue.popFromHead();}//是否为空public boolean isEmpty() {return queue.isEmpty();}}//构造队列public static class MyQueue<T> {private DoubleEndQueue<T> queue;public MyQueue() {queue = new DoubleEndQueue<>();}public void push(T data) {queue.addFromHead(data);}public T poll() {return queue.popFromBottom();}public boolean isEmpty() {return queue.isEmpty();}}//判断两个Integer节点是否相等public static boolean isEqual(Integer o1, Integer o2) {if (o1 == null && o2 == null) return true;if (o1 == null && o2 != null) return false;if (o1 != null && o2 == null) return false;return o1.equals(o2);}public static void main(String[] args) {int oneTestDataNum = 100;int value = 10000;int testTimes = 100000;for (int i = 0; i < testTimes; i++) {Code03_DoubleEndsQueueToStackAndQueue.MyStack<Integer> myStack = new Code03_DoubleEndsQueueToStackAndQueue.MyStack<>();Code03_DoubleEndsQueueToStackAndQueue.MyQueue<Integer> myQueue = new Code03_DoubleEndsQueueToStackAndQueue.MyQueue<>();Stack<Integer> stack = new Stack<>();Queue<Integer> queue = new LinkedList<>();for (int j = 0; j < oneTestDataNum; j++) {int nums = (int) (Math.random() * value);if (stack.isEmpty()) {myStack.push(nums);stack.push(nums);} else {if (Math.random() < 0.5) {myStack.push(nums);stack.push(nums);} else {if (!isEqual(myStack.pop(), stack.pop())) {System.out.println("oops!");}}}int numq = (int) (Math.random() * value);if (queue.isEmpty()) {myQueue.push(numq);queue.offer(numq);} else {if (Math.random() < 0.5) {myQueue.push(numq);queue.offer(numq);} else {if (!isEqual(myQueue.poll(), queue.poll())) {System.out.println("oops!");}}}}}System.out.println("finish!");}
}
三、数组实现队列
(数组实现栈就比较简单 因为都是入栈出栈只需在一个方向,下一个index索引加1就能满足,其他逻辑类似,而队列,需要判断是index+1还是回到0索引位置)
package class03;/*** */
//数组实现队列, 栈就比较简单 入栈就直接按需从0索引赋值,出栈也是从最后一个索引arr.length-1开始弹出
//队列就是先进先进,入栈从0开始,出栈从0开始,而且中间出栈后,0位置空,接着要入栈就得判断下一个位置
// 是否超边界,是否超大小,如果超大小就肯定满了,如果没有超,就看下个位置会不会越界,会就需要入栈到0位置,
// 形成一个环形循环数组public class RingArray {public static class MyQueue {private int[] arr;private int pushi; //随着插入,这个索引就往下,所以表示是 元素边界的end边界private int polli; //beginprivate int size; //存在数组中的元素个数private final int limit; //数组的长度设置为常量 不可修改public MyQueue(int limit) {arr = new int[limit];pushi = 0;polli = 0;size = 0;this.limit = limit;}public void push(int value) {//先判断size元素实际个数是否与数组长度相等 相等就不能入队列了if (size == limit) {throw new RuntimeException("队列满,不能添加元素!");}size++;//赋值arr[pushi] = value;//判断下个索引pushi = nextIndex(pushi);}public int poll() {//先判断size元素实际个数是否为0,0则没有元素 不能出队列if (size == 0) {throw new RuntimeException("队列空,不能弹出元素!");}size--;//返回弹出元素,该索引位置的内容无需重新赋值,因为下次元素push到该位置会赋值覆盖的int ans = arr[polli];//判断下个索引polli = nextIndex(polli);return ans;}public boolean isEmpty() {return size == 0;}//判断元素的下个索引,需要与arr[limit-1]即数组最后一个索引比较,如果小于表示可以接着+1,//大于等于就需要循环走到0索引位置public int nextIndex(int index) {return index < limit - 1 ? ++index : 0;}}
}
四、通过两个栈结构,来实现获取栈中的最小值
package class03;import java.util.Stack;/****///通过两个栈结构,来实现获取栈中的最小值
public class GetMinStack {public static class MyStack1 {private Stack<Integer> stackData;private Stack<Integer> stackMin;public MyStack1() {stackData = new Stack<>();stackMin = new Stack<>();}public void push(int num) {//如果当前最小值为空,那么入栈的值就定为最小值,入最小栈if (stackMin.isEmpty()) {stackMin.push(num);} else {//如果非空,而当前值小于等于最小栈的最小值,那么就入栈,大于则不用入栈。保证最小栈栈顶是最小值if (num <= this.getmin()) {stackMin.push(num);}}stackData.push(num);}public int pop() {if (stackData.isEmpty()) {throw new RuntimeException("数据栈为空,没有元素!");}//数据栈出栈int ans = stackData.pop();//同时要判断是否出栈的是与当前最小栈的栈顶一样 是则需要一起出栈 才能保持始终为最小值栈顶if (ans == this.getmin()) {stackMin.pop();}return ans;}public int getmin() {if (stackMin.isEmpty()) {throw new RuntimeException("最小栈为空,没有元素!");}//非空则取栈顶元素即最小值return stackMin.peek();}}public static void main(String[] args) {MyStack1 stack1 = new MyStack1();stack1.push(3);System.out.println(stack1.getmin());stack1.push(4);System.out.println(stack1.getmin());stack1.push(1);System.out.println(stack1.getmin());System.out.println(stack1.pop());System.out.println(stack1.getmin());System.out.println("=============");}
}
五、两个栈实现队列,队列先进先出,栈先进后出,需要用两个栈来实现
package class03;import java.util.Stack;/*** 两个栈实现队列,队列先进先出,栈先进后出,需要用两个栈来实现*/
public class TwoStacksImplementQueue {public static class TwoStacksQueue{private Stack<Integer> stackPush;private Stack<Integer> stackPop;public TwoStacksQueue(){stackPush = new Stack<>();stackPop = new Stack<>();}public void add(int num){stackPush.push(num);}//出栈注意,假设//pop栈有数据就直接出栈。 没数据就需要将现有的push栈数据全部清空入pop栈,在出pop栈public int poll(){if(stackPop.isEmpty() && stackPush.isEmpty()){throw new RuntimeException("队列为空,没有元素!");}if(!stackPop.isEmpty()){return stackPop.pop();}else{while(!stackPush.empty())stackPop.push(stackPush.pop());}return stackPop.pop();}public int peek(){if(stackPop.isEmpty() && stackPush.isEmpty()){throw new RuntimeException("队列为空,没有元素!");}if(!stackPop.isEmpty()){return stackPop.peek();}else{while(!stackPush.empty())stackPop.push(stackPush.pop());}return stackPop.peek();}}public static void main(String[] args) {TwoStacksQueue test = new TwoStacksQueue();test.add(1);test.add(2);test.add(3);test.add(4);System.out.println(test.peek());System.out.println(test.poll());System.out.println(test.peek());System.out.println(test.poll());System.out.println(test.peek());System.out.println(test.poll());}
}
六、两个队列实现一个栈结构
package class03;import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;/*** 两个队列实现一个栈结构*/
public class TwoQueueImplementStack {public static class TwoQueueStack<T> {private Queue<T> queue;private Queue<T> help;public TwoQueueStack() {queue = new LinkedList<>();help = new LinkedList<>();}public void push(T value) {queue.offer(value);}public T poll() {//把队列都弹出到help辅助队列,保留最后一个不弹,用来popwhile (queue.size() > 1) {help.offer(queue.poll());}T ans = queue.poll();//此时queue为空队列,再把help队列数据放回来Queue<T> temp = queue;queue = help;help = temp;return ans;}public T peek() {//把队列都弹出到help辅助队列,保留最后一个不弹,用来popwhile (queue.size() > 1) {help.offer(queue.poll());}T ans = queue.poll();//这里注意要把弹出的最后一个元素入回队列help.offer(ans);//此时queue为空队列,再把help队列数据放回来Queue<T> temp = queue;queue = help;help = temp;return ans;}public boolean isEmpty() {return queue.isEmpty();}}public static void main(String[] args) {System.out.println("test begin");TwoQueueStack<Integer> myStack = new TwoQueueStack<>();Stack<Integer> test = new Stack<>();int testTime = 1000000;int max = 1000000;for (int i = 0; i < testTime; i++) {if (myStack.isEmpty()) {if (!test.isEmpty()) {System.out.println("Oops");}int num = (int) (Math.random() * max);myStack.push(num);test.push(num);} else {if (Math.random() < 0.25) {int num = (int) (Math.random() * max);myStack.push(num);test.push(num);} else if (Math.random() < 0.5) {if (!myStack.peek().equals(test.peek())) {System.out.println("Oops");}} else if (Math.random() < 0.75) {if (!myStack.poll().equals(test.pop())) {System.out.println("Oops");}} else {if (myStack.isEmpty() != test.isEmpty()) {System.out.println("Oops");}}}}System.out.println("test finish!");}}
七、Master公式
形如
T(N)= a * T(N/b) + O(N^d)(其中的a、b、d都是常数)
的递归函数,可以直接通过Master公式来确定时间复杂度
如果log(b,a)< d,复杂度为O(N^d)
如果 log(b,a)> d,复杂度为O(N^log(b,a))
如果 log(b,a)== d,复杂度为O(N^d *logN)
注意:
(注意是需要两次子递归的递归元素是同等的,比如中点分开左右两数组,分别递归,此时两个子递归元素都是N/2,时间复杂度O(N/2)+O(N/2),例如归并排序)
归并排序,递归过程还需要进行合并左右数组,需要合并操作时间复杂度为O(N)
此形式符合Master公式,T(N)= 2 * T(N/2) + O(N^1) ,a=2,b=2,d=1,
log(2,2) == 1 所以归并排序复杂度为O(N *logN)
八、哈希表
1)哈希表在使用层面上可以理解为一种集合结构
2)如果只有key,没有伴随数据value,可以使用HashSet结构
3)如果既有key,又有伴随数据value,可以使用HashMap结构
4)有无伴随数据,是HashMap和HashSet唯一的区别,实际结构是一回事
5)使用哈希表增(put)、删(remove)、改(put)和查(get)的操作,可以认为时间复杂度为 O(1),但是常数时间比较大
6)放入哈希表的东西,如果是基础类型,内部按值传递,内存占用是这个东西的大小
7)放入哈希表的东西,如果不是基础类型,内部按引用传递,内存占用是8字节
九、有序表
1)有序表在使用层面上可以理解为一种集合结构
2)如果只有key,没有伴随数据value,可以使用TreeSet结构
3)如果既有key,又有伴随数据value,可以使用TreeMap结构
4)有无伴随数据,是TreeSet和TreeMap唯一的区别,底层的实际结构是一回事
5)有序表把key按照顺序组织起来,而哈希表完全不组织
6)红黑树、AVL树、size-balance-tree和跳表等都属于有序表结构,只是底层具体实现不同
7)放入如果是基础类型,内部按值传递,内存占用就是这个东西的大小
8)放入如果不是基础类型,内部按引用传递,内存占用是8字节
9)不管是什么底层具体实现,只要是有序表,都有以下固定的基本功能和固定的时间复杂度
1)void put(K key, V value)
将一个(key,value)记录加入到表中,或者将key的记录更新成value。
2)V get(K key)
根据给定的key,查询value并返回。
3)void remove(K key)
移除key的记录。
4)boolean containsKey(K key)
询问是否有关于key的记录。
5)K firstKey()
返回所有键值的排序结果中,最小的那个。
6)K lastKey()
返回所有键值的排序结果中,最大的那个。
7)K floorKey(K key)
返回<=key 离key最近的那个
8)K ceilingKey(K key)
返回>=key 离key最近的那个
哈希表在使用时,增删改查时间复杂度都是O(1)
有序表在使用时,比哈希表功能多,时间复杂度都是O(logN)
相关文章:
【算法数据结构体系篇class03】:数组、链表、栈、队列、递归时间复杂度、哈希表、有序表问题
一、反转链表package class03;import java.util.ArrayList; import java.util.List;/*** 链表反转*/ public class ReverseLinkedList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {p…...
【新2023】华为OD机试 - 最多提取子串数目(Python)
最多提取子串数目 题目 给定由 [a-z] 26 个英文小写字母组成的字符串 A 和 B,其中 A 中可能存在重复字母,B 中不会存在重复字母 现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 1) 同一个位置的字母只能被挑选一次 2) 被挑选字母的相对先后顺序不…...
嵌入式C语言设计模式 --- 代理模式
1 - 什么是代理模式? 代理模式(Proxy Pattern),是指当客户端无法访问某个对象或者访问某个对象存在困难的时候,可以通过一个代理对象来进行间接访问。 举一个生活中的例子,比如,我们在买火车票或者飞机票的时候,有时候不会直接在12306或者航空公司官网上面购买,而是…...
前端性能优化的整理笔记
🚴 前言大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库🏄利用碎片化的时间,系统的整理,性能优化的知识点。🎯 前端性能优化…...
springboot+mybatis连接数据库实现增删改查功能
springbootmybatis连接数据库实现增删改查功能创建表创建项目实体类DAO接口写sql的XML文件Service层Controller启动类结果目录结构参考博客创建表 create table user(id int ,name varchar(30),pwd varchar(40) )insert into user values(2,hxf,789101),(3,hlm,789102),(4,hzh…...
疑似45亿地址信息泄露事件跟进后续
开放隐私计算 收录于合集#数据安全13个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区…...
Hadoop集群配置
一、系统文件配置集群部署规划NameNode和SecondaryNameNode不要安装在同一台服务器ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode放在同一台机器上。这里装了四台机器,ant151,ant152,ant153,ant154。ant151ant152ant153ant154NameNode…...
【C语言】程序环境和预处理|预处理详解|定义宏(下)
主页:114514的代码大冒 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef 编辑 4 命令行定义…...
MySQL主从复制
操作流程准备两个服务器主服务器配置1>修改主配置文件 /etc/my.cnf[mysald] log-binmysql-bin //[必须]启用二进制日志server-id12>重启 mysql 服务3>创建mysql用户并授权mysql> GRANT REPLICATION SLAVE ON ** to slaver% identified by 123456;4>查看当前主服…...
做自媒体视频变现的三大要素!
大家都知道做自媒体可以赚钱,做得好的话收入会远超自己的工资! 但有些关键点你真的知道吗?有几点是新手很容易忽略的! 1、内容价值 我们所创作的内容是否是用户所需要的?用户是不是有强烈的需求?这一点你…...
软件测试如何获得高薪?
软件测试如何获得高薪? 目录:导读 测试基础理论/测试设计能力 业务知识 行业技术知识 数据库 掌握编程语言 搞定自动化测试 质量流程管理 下面谈谈不同level的测试工程师应具备的基本能力 第一个:我们称之为测试员/测试工程师 第二…...
《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)
5.4 特权级深入浅出 5.4.1 特权级哪点事 计算机 访问 可分为访问者和被访问者。 建立特权机制为了通过特权来检查合法性。 0、1、2、3级,数字越小,权力越大。 0特权级是系统内核特权级。 用户程序是3特权级,被设计为“有需求就找操作系统”…...
艾德卡EDEKA EDI 需求分析
艾德卡Edeka 是德国最大的食品零售商,因其采用“指纹付款”的方式进行结算,成为德国超市付款方式改革的先驱。2022年8月,入选2022年《财富》世界500强排行榜,位列第256位。 艾德卡EDEKA EDI需求分析 传输协议 在传输协议层面&a…...
python如何使用最简单的方式将PDF转换成Word?
由于PDF的文件大多都是只读文件,有时候为了满足可以编辑的需要通常可以将PDF文件直接转换成Word文件进行操作。 看了网络上面的python转换PDF文件为Word的相关文章感觉都比较复杂,并且关于一些图表的使用还要进行特殊的处理。 本篇文章主要讲解关于如何…...
HashMap如何避免内存泄露问题
HashMap对于Java开发人员来说,应该是一种非常非常熟悉的数据结构了,应用场景相当广泛。 本文重点不在于介绍如何使用HashMap,而是关注在使用HashMap过程中,可能会导致内存泄露的情况,下面将以示例的形式展开具体介绍。…...
crontab -e定时任务
大家好,我是空空star,本篇带你了解下crontab -e定时任务。 文章目录前言一、crontab介绍二、crontab文件的含义四、crontab用法1.每隔5分钟执行一次命令2.每个小时的第5分执行一次命令3.每天9:05执行一次命令4.每隔9小时在第5分执行一次命令5.每月5号9号…...
JavaSE学习day7_01 面向对象
1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。即各个对象的总称,比如学生是一个类,但是学生有很多个,每一个称之为对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的…...
有趣的HTML实例(十二) 早安、晚安动画(css+js)
这话在我心里已经复习了几千遍。我深恨发明不来一个新鲜飘忽的说法,只有我可以说只有你可以听,我说过,我听过,这说法就飞了,过去、现在和未来没有第二个男人好对第二个女人这样说。 ——《围城》 目录 一、前言 二、…...
入行测试已经4年了 ,进华为后迷茫了3个月,做完这个项目我决定离职....
转行测试 我是大专非计科,我转行之前从事的工作是商场管理,努力了4年左右的时间才做到楼层经理,但是工资太低并且事情太多,薪资才6K。 更多的是坚定了自己的想法,我要改变自己 恰好有几个大学同学在互联网公司工作&a…...
【halcon】灰度直方图直观理解与应用
灰度直方图 横坐标:是 0~255 表示灰度值的范围 纵坐标:是在不同灰度值下像素的个数! 那么灰度直方图的本质就是统计不同灰度下像素的个数! 它的直观目的,就是查看灰度的分布情况! 与之相关的函数ÿ…...
Android笔记:动画
文章目录1.View Animation(视图动画)1.1 Tween Animation(补间动画)Animation 继承属性透明度alpha缩放scale移动translate旋转rotateset标签Animation父类共有函数1.2Frame Animation (逐帧动画)2.Propert…...
Git学习总结
目录 Git工作的基本流程图 git基本配置 配置SSH公钥 查看提交日志(log) 版本回退 为常用指令配置别名 添加文件至忽略列表 Git操作的基本指令 编辑 Git远程仓库的操作 把黑马的Git视频看完了黑马程序员Git全套教程,完整的git项目管…...
第四天笔记
1. 简述自定义转换器的使用过程? 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。 第二步:在 spring配置文件中配置类型转换器。 Spring配置类型转换器的机制是 将自定义的转换器注册到类型转换服务中去…...
《MySQL学习》 全局锁和表锁
一.MySQL锁的分类 二.全局锁 全局锁对整个数据库加锁,可以执行如下命令,整个数据库都将处于只读状态。 Flush tables with read lock ;我们可以执行 unlock table进行解锁 unlock table ;读操作 非读操作(阻塞) 全局锁的典型使…...
Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD
AD软件版本:22.2.1 gerber文件输出共有两部分: 1、Gerber Files:铜皮 和 外形分别导出 2、Nc Drill Files 分3次导出 一、Gerber Files 导出2次 设定原点 ** Edit->Origin->Set** 一般板边左下角为原点,可以根据自己板子形状确定 导…...
用VSCode搭建Vue.js开发环境及Vue.js第一个应用
目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,可用于Windows,macOS和Linux。它内置了对JavaScrip…...
Leetcode 每日一题 2341. 数组能形成多少数对
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
前后端分离-小项目-3前后端交互
第一步编写前端页面,第二步搭建后端环境,现在开始第三步,继续完善前端功能完善“添加”按钮功能Ajax异步请求安装在前端项目安装ajax。在Terminal输入:npm i axios -S点击“添加”按钮,弹出Dialog对话框设置对话框里面…...
Spring如何整合MyBatis框架?使用XML及java类的配置方式
前言 Spring文章链接: 从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…...
第七届蓝桥杯省赛——8冰雹数(递归)
题目:任意给定一个正整数N,如果是偶数,执行: N / 2如果是奇数,执行: N * 3 1生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上升到很高,一会…...
给公司做网站风险/高级seo培训
一、复习 1.1、字符设备驱动编写 alloc_chrdev_region/register_chrdev_regioncdev_alloccdev_initcdev_addclass_createdevice_create 注意:错误处理,goto语句 卸载的时候:释放申请的资源,并删除注册的结构体 1.2、设备文件创…...
网站上线要准备什么/会计培训
登录时的填写密码显示文本或者显示黑点切换其实就是两个div的v-if/else判断; 下面详细说下具体实现过程;(附代码图) 第一步: 默认密码显示的是黑点: 显示密码文本: 代码部分这样写: 红线框圈住…...
手机网站大全12345/站长工具域名查询社区
1.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期࿰…...
wordpress与github同步/广州seo成功案例
[问题描述] 你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数…...
用自己的名字做网站域名/南昌关键词优化软件
记录今天遇到的一个小问题: AtomicInteger atomicInteger new AtomicInteger();System.out.println(atomicInteger.getAndIncrement()); 大家可以先猜想一下这个输出的是几,我之前一直以为是1,但是今天发现好像并不是。它是0。 public fina…...