- 博客(79)
- 收藏
- 关注
原创 递归及相关练习题
在数学上,斐波纳契数列被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。示例4:写一个递归方法:输入一个非负整数,返回组成它的数字之和。例如:输入1729,则返回1+7+2+9,它的和是19。示例5:斐波那契数列:第0项是0,第1项是第一个1。示例2:按顺序打印一个数字的每一位(例如:1234打印出1 2 3 4 )递归相当于数学上的“数学归纳法”,有一个起始条件,然后有一个递推公式。示例3:递归求1+2+3+···+10。2、递归出口(即起始条件)
2024-10-30 10:54:52
294
原创 方法的使用
Java中无指针,下列函数无法实现在主方法中a,b值的交换,只能在swap方法中实现x,y的交换。★方法的调用是需要开辟内存的,方法调用结束这块内存就会被销毁了。public static 返回值 方法名(形式参数列表){1、实现一个函数,检测一个年份是否为闰年。
2024-10-30 10:25:45
146
原创 逻辑控制练习题
不能做Switch参数的类型有:long、float、double、boolean。1、能被4整除的大多是闰年,除了那些能被100整除而不能被400整除的年份以外。2、世纪年能被4整除,且不能被100整除的是闰年。要求使用break或者continue。3、世纪年能被400整除的是闰年。
2024-10-29 22:05:56
190
原创 Java初始、数据类型与变量
注: 标识符不能以数字开头,也不能是关键字,且严格区分大小写。(1)一个Java文件 只能有一个public修饰的类。小数并没有一个非常精确的数字(精确到小数点后几位)(2)文档注释 /** 文档注释 **/(3)标识符(字母、数字、下划线及$符号)表达式2 : 表达式3。(1)i++ 后置增量运算符。(2)i-- 后置减量运算符。(3)++i 前置增量运算符。(4)--i 前置减量运算符。i的值在运算符执行后被增加。i的值在运算符执行后被减少。i的值在运算符执行前被增加。
2024-10-29 21:44:41
303
原创 数据结构 - 排序
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的:否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。插入排序直接插入排序的优点。
2024-10-27 19:37:10
703
原创 数据结构 - 优先级队列 堆
数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象,这样的数据结构就是优先级队列。从堆的概念可知,注意:对于,因为为了能够还原二叉树,接下来的问题,就是如何实现代码,来创建一个优先级队列?=》 一定要看做是大根堆或者小根堆。● 如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为(i-1)/2● 如果2 *i+1 小于节点个数,则节点i的左孩子下标为2 *i+1,否则没有左孩子。
2024-10-27 17:04:41
436
原创 数据结构 - 二叉树相关题目(二)
给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请构造二叉树并返回其根节点。给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。谁多谁先出,剩下一样多节点时在同时出,相同就是最近祖先。公共祖先:对于有限树T的两个节点p,q,最近的公共祖先表示为一个结点x,满足x是p,q的祖先且x的深度尽可能大(一个结点可以是它自己的祖先)。
2024-10-27 16:09:25
289
原创 数据结构 - 二叉树
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树,左子树 -》 根 -》 右子树 D B A E C F。一棵树如果是 二叉树 那么他的每棵树都是二叉树。如果一棵二叉树的层数为K,且结点总数是。二叉树:每个节点 度都是<=2的。二叉树的存储结构分为:顺序存储和。遍历:指的是 沿着某条路线遍历。
2024-10-27 16:07:57
368
原创 数据结构 - 队列相关习题
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种基本操作(push,top,pop,empty).请你仅使用两个栈实现一个先入先出的队列,并支持普通队列的全部基本操作(push,pop,peek,empty).2. 出队的时候 都出第2个栈当中的元素 ,当第2个栈没有元素的时候,把第一个栈当中的元素全部倒过来!boolean empty()如果栈是空的,返回true;3.当两个队列都是空的时候 ,那么说明我们模拟的栈是空的。int pop()将队列的开头移除并返回元素。
2024-10-27 15:20:53
204
原创 数据结构 - 栈的应用场景
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能关该栈的弹出顺序,暇设压入栈的所有数字均不相等。例如序列1.2.3.4.5.入顺序,序列4.5,3.2,1是该压栈序列对应的一个弹出序列,但4.3.5.1.2就不可能导该压栈序列的弹出序列。3、括号匹配:给定一个只包括’{‘,’}’,’(‘,’)’,’[‘,’]’的字符串s,判断字符串是否有效。2.最小栈如果是空的 也要放,不为空且要存放的元素小于最小栈的栈顶,那么就也要放到最小栈。请你计算该表达式,返回一个表示表达式值的整数。
2024-10-27 15:08:16
452
原创 数据结构 - 栈
链表来实现栈的问题入栈 出栈 O(1)如果是双向链表(链式栈:此时双向链表也可以当做栈来使用)如果是单链表没有last这个引用假设 从头入栈-》 O(1) 从头出:删除头结点O(1)假设 从 尾巴入-》O(N)(有last为O(1)) 从尾巴出:O(N)
2024-10-27 15:08:11
107
原创 数据结构 - 有关链表的习题
为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始),注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。)链表分割:现有一个链表的头指针ListNode * pHead,给一定值x,编写一段代码将所有小于x的节点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。如果两个链表不存在相交的节点,返回null。4、将两个有序(从小到大排列)链表合并为一个新的有序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成的。
2024-10-27 14:39:14
1852
原创 数据结构 - ArrayList的具体使用
i][j] [i-1][j] + [i-1][j-1] = [i][j] (集合类)每个人都有自己的list。
2024-10-26 23:05:06
140
原创 数据结构 - ArrayList 与 顺序表
5、和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList;4、ArrayList实现了Serializable接口,表明ArrayList是支持序列化的;3、ArrayList实现了Cloneable接口,表明ArrayList是可以clone的;6、ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。1、ArrayList是以泛型方式实现的,使用时必须要先实例化;
2024-10-26 23:01:46
332
原创 数据结构 - 时间复杂度和空间复杂度
使用大O阶渐进表示法以后,Func1的时间复杂度为O(N) = N^2。常见复杂度:O( log2N) O(N) O(N*logN) O(N^2):是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。★时间复杂度的计算,一定要结合代码的思想,而不能单纯只看代码。:算法中的基本操作的执行次数,为算法的时间复杂度。算法在运行过程中,临时占用存储空间大小的量度。2、在修改后的运行次数函数中,只保留最高阶项;剩下最后一个才被找到 就是最坏情况!
2024-10-26 21:59:34
277
原创 网络原理 - 数据链路层(二十三)
IP 地址和 Mac 地址各自的用途是什么?IP 协议立足于全局,完成整个通信过程的路径规划工作.以太网 则是关注于局部,相邻两个设备之间的通信过程~~像交换机这样的设备,收到以太网数据帧的时候,就需要进行转发.(这个转发过程就需要能够根据 mac 地址,判定出数据要这里的网口是“物理意义”上插网线的口(IP 协议,路由器,走哪个网络接口,其实是抽象的概念,最终还是要在数据链路层才能决定是走哪个网口..)具体如何转发?交换机内部也有一个数据结构"转发表”
2024-10-26 20:16:17
388
原创 网络原理 - 网络层(二十二)
这个方案,治标不治本,提高了 IP 地址的利用率,并没有增加 IP 地址的数目(虽然这是一个 过度 方案,这个方案目前仍然是广泛存在的)2)路由选择.网络环境比较复杂的,从一个节点到另一个节点之间,存在很多条不同的路径,就需要通过这种方式, 筛选/规划出更合适的路径进行数据传输。而进行 |P 数据报转发的时候,每个路由器,都是无法知道,网络的“全貌”的,只知道一些局部信息。钱花出去, 没有收益!上述和 IP 地址相关的规则,也是 IP 协议的一部分.(IP 协议,两个核心功能,地址管理,路由选择)
2024-10-26 20:04:51
632
原创 网络原理 - 应用层(二十)
(和程序员接触最密切)应用程序在应用层这里,很多时候, 都是程序员"自定义"应用层协议的,(当然,也是有一些现成的应用层协议)这里的自定义协议,其实是非常简单的~~(协议 =>约定,程序员在代码中规定好,数据如何进行传输)1.根据需求,明确要传输的信息2.约定好信息按照什么格式来组织点开 外卖软件,首先会看到商家列表~~这里就涉及到程序和服务器之间进行的网络通信交互请求: 用户信息,位置信息.此处假设就使用简单的格式来组织,使用文本的方式.三个属性,使用",来分割。
2024-10-26 18:13:14
225
原创 UDP 的 socket api 如何使用(十九)
2.客户端开始启动,也会先进入 while 循环,执行 scanner.next. 并且也在这里阻塞当用户在控制台输入字符串之后,next 就会返回,从而构造请求数据并发送出来~~另一方面,用户这边如果出现端口冲突了,他也不知道是端口冲突,他也不知道该咋解决,只会骂这个程序员,你这啥|程序员,写的啥程序,竟是bug.!UDP 无连接的~~ (UDP 自身不会保存数据要发给谁),就需要每次发送的时候,重新指定,数据要发到哪里去!服务器是在程序猿手里的、一个服务器上都有哪些程序,都使用哪些端口,程序猿都是。
2024-10-26 17:01:48
884
原创 TCP 和 UDP的区别(十八)
UDP 想要通信,就直接发送数据即可~~不需要征得对方的同意,UDP 自身也不会保存对方的信息.(UDP 不知道,但是写程序的人得知道.UDP 自己不保存,但是你调用 UDP 的 socket api的时候要把对方的位置啥的给传过去)计算机中,这种 抽象 的连接是很常见的,此处的连接本质上就是建立连接的双方,各自保存对方的信息两台计算机建立连接,就是双方彼此保存了对方的关键信息~~无线通信的手段,5G 之类的,当然很厉害,但是他们传输的速率/稳定性,一定是不如有线的!一个信道,允许双向通信,就是全双工。
2024-10-25 23:13:55
286
原创 封装和分用(十七)
o”,给打包成一个应用层的数据报 (这个数据报的格式,得是 99 的程序员才能知道)假设是按照这样的格式:(我自己随手一写)此处使用 UDP 协议,针对这个数据报进行解析,拿到载荷,去掉报头,把载荷数据进一步的交给上层 (应用层了) 根据端口号来区分把数据交给哪个应用程序。IP 协议,再进一步的针对网络层数据报进行解析,去掉报头,拿到载荷,再进一步把载荷数据交给上层(传输层)就要对刚才的应用层数据,再进行打包,变成传输层的数据报~~传输层数据报完成了之后,这个数据又会进一步的交给网络层。
2024-10-25 22:47:15
819
原创 网络初识(十六)
实际上,现在的路由器和交换机功能都越来越强大了.(甚至说一些高端的交换机,也有路由功能)另一方面,路由器交换机可能还会支持一些更复杂的操作,甚至可能会工作在传输层或者应用层。不同的程序,就可以关联/绑定到不同的端口号要求同一个主机上的应用程序,不能关联到同一个端口号.(一个端口号只能被一个程序绑定,但是一个程序可以绑定多个端口)只要会说语,就能打电话,不需要了解细节,上到我 90 岁的外婆下到我儿子5岁的小汤都可以打电话...上述的这套规则,其实是针对“传统的"“经典的"交换机和路由器来描述的,
2024-10-25 22:31:44
509
原创 文件IO(十四)
此时文件中的每个数据都是合法的 utf8 编码的字符,就可以认为这个文件是文本文件了,如果存在一些不是 utf8 合法字符的情况,就是二进制了。:需要先指定一个目录,作为基准目录,从基准目录出发,看看沿着啥样的路线能够找到指定文件,.此时涉及到的路径就是"相对路径!一台计算机上,有很多的文件,这些文件是通过 "文件系统”(操作系统提供的模块) 来进行组织的.2.二进制 (文件中保存的数据,仅仅是二进制数据,不要求保存的内容是 合法的字符(1.文本(文件中保存的数据,都是字符串,保存的内容都是 合法的字符)
2024-10-25 22:11:59
737
原创 线程安全的集合类(十三)
" ConcurrentHashMap 在底层编码过程中,比较谨慎的处理了一些细节修改的时候会避免使用 ++-- 这种非原子的操作. 使用 =进行修改,本身就是原子的. 读的时候,要么读到的是写之前的旧值,要么是读到写之后的新值,不会出现读到一个 一半的 值,如果某个线程需要进行修改,就把 ArrayList, 复制出一份副本,修改线程,就修改这个副本,与此同时,另一个线程仍然可以读取数据(从原来的数据上进行读取)如果两个线程,操作的是不同的链表,就根本不用加锁,只有说操作的同一个链表才需要加锁.
2024-10-25 21:54:09
586
原创 信号量Semaphore、CountDownLatch(十二)
这个东西,主要是适用于,多个线程来完成一系列任务的时候,用来衡量任务的进度是否完成比如需要把一个大的任务,拆分成多个小的任务,让这些任务并发的去执行,1.await,调用的时候就会阻塞,就会等待其他的线程完成任务,所有的线程都完成了任务之后,此时这个 await 才会返回,才会继续往下走.操作系统, 提供了 信号量 实现, 提供了 api. JVM 封装了这样的 api, 就可以在 java 代码中使用了。相比之下,有一些专业的下载工具,就可以成倍的提升下载速度,(IDM)加锁操作,P 操作,1 ->0。
2024-10-25 21:39:21
127
原创 synchronized原理 、 锁、Callable 接口 (十一)
synchronized原理synchronized背后做的一些工作,(面试常见问题synchronized 几个重要的机制:1. 锁升级 ***锁升级的过程,就是在性能和线程安全之间尽量进行权衡偏向锁的核心思想,以前讲过,就是"懒汉模式"另一种体现.能不加锁,就尽量不加锁. 加锁意味着有开销,锁消除,也是一种编译器优化的手段编译器会自动针对你当前写的 加锁的代码,做出判定,如果编译器觉得这个场景,不需要加锁,此时就会把你写的synchronized 给优化掉锁粗化。
2024-10-25 21:31:43
418
原创 常见锁策略 和 CAS(十)
但是, 这种判定方式,不够严谨.更极端的情况下,可能有另一个线程穿插进来,把值从 A ->B ->A,针对第一个线程来说,看起来好像是这个值,没变,但是实际上已经被穿插执行了。操作系统提供的加锁 api 默认情况, 就属于"非公平锁”,如果要想实现 公平锁,你还需要引入额外的队列,维护这些线程的加锁顺序.一个线程针对同一把锁,连续加锁两次,不会死锁,就是可重入锁. 会死锁, 就是不可重入锁.单个的 cpu 指令, 是原子的!乐观锁, 通常也就是轻量级的锁,悲观锁, 通常也就是重量级的锁。
2024-10-25 21:18:24
641
原创 定时器 *** (八)
可能在等待过程中,主线程调用 schedule 添加一个新的任务,新的任务是 14:10 执行,比刚才最早的任务还早!之所以的代码,使用的是 PriorityQueue,而不是 PriorityBlockingQueue,其实就是因为要处理两个 wait 的地方使用阻塞版本的优先级队列,不方便实现这样的两处等待。给 Timer 中添加的这些任务,都是带有一个“时间”一定是时间小的先执行最先执行的就是时间最小的任务!TreeSet/TreeMap)如果时间最小的任务,还没到时间呢,其他任务更不会到时间了!
2024-10-25 12:50:19
774
原创 线程池(九)
假设一个线程的所有代码都是 cpu 密集型代码,这个时候,线程池的数量不应该超过 N (设置 N 就是极限了)设置的比 N 更大,这个时候,也无法提高效率了.(cpu 吃满了)此时更多的线程反而增加调度的开销.使用协程更多的是 Go (Go诞生的时候主打的卖点,协程就是一个)和Python(Python的线程是废柴,后来有了协程之后,相比于之前的线程香太多了)有对比,才有伤害,和进程比,线程是更快了,但是如果进一步提高创建销毁的频率,线程的开销也不能忽视了!在接触到实际的项目代码之前,无法确定设置数目。
2024-10-25 12:47:36
261
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人