- 博客(52)
- 收藏
- 关注
原创 Java爬虫|爬虫爬jj榜单数据写入excel
大学的时候选python课 课设就是让我们用爬虫去爬取数据 写入文件 然后再做数据分析 词云图 地图分类等 python已经记不清了 现在用Java尝试一下爬取数据。爬虫分为三步骤:1.获取你自己电脑访问网站的时候的请求头 2.目标网站的url 3.对爬出来的网页返回值进行切分出有用的部分。
2025-03-25 14:31:16
1488
原创 Android定时任务实现每隔一段时间切分录音文件,audiorecord实现录音
为了避免音频大文件传输影响网络传输效率,选择边录边切分进行传输,比如我从开始录音的button按钮到结束录音的button按钮的点击 大概间隔了70s,而我需要的是30s切分成一段pcm文件,每隔30s存储,那么这70s就会被切分成30s,30s,10s。
2024-12-20 09:02:04
955
原创 android编译lame库实现wav转mp3,有损压缩wav文件
app方如果要传输音频文件到服务器,wav文件整体来说还是太大了,所以选择使用有损压缩mp3格式,编译使用lame库。
2024-12-19 16:46:54
1061
原创 ConcurrentLinkedQueue<>实现生产者-消费者问题理解和简易demo
更简便的是使用 Java 提供的 BlockingQueue,例如 ArrayBlockingQueue 或 LinkedBlockingQueue,这些类提供了内置的阻塞机制,在缓冲区满时生产者阻塞,在缓冲区为零时消费者阻塞,透明地处理同步问题。整体demo就是开了两个线程对queue进行操作,queue可以认为是数据共享区,一个线程生产数据,一个线程消费数据,可以在队列为空时候进行其他操作,本demo只是个示例,意指在Java中对如何实现生产者-消费者问题有初步理解可以运用于项目中。
2024-12-09 18:04:30
579
原创 windows将文件推给Android真机/实机
只讲述一下三星手机开启开发者模式只讲个例子 因为当时开启的时候我也搜了很多帖子;以sumsung s23u为例。4.推送命令adb push 文件路径 /sdcard/download。记录一下 因为以前只试过从真机实机中将文件推给windows。步骤1和2和3不作赘述,可以搜相关配置教程 手机因人而异。关于手机--->点击软件信息--->多次点击编译编号。但是从windows只简单复制粘贴的话会一直报错。2.手机开启开发者模式 usb调试。3.usb连接选择文件传输。后利用adb进行推送。
2024-12-09 14:21:04
446
原创 Android Studio使用soundtouch实现变声,AudioRecord,AudioTrack录音和播放,转换pcm文件为wav文件
分步骤实现为1.0 集成使用soundtouch so文件 done1.1 audiorecord和audiotrack 录音(pcm文件)并播放 done1.2 把录音后文件转成wav文件 并播放 done1.3 soundtouch变音后播放 done。
2024-11-30 14:47:08
1320
1
原创 Android studio 利用cmake编译和使用so文件
Android studio会自动给一个含有jni的demo,运行打印出 hello c++;删掉原先方法,不建议在MainActivity里面书写jni然后生成so文件。这边需要注意包名_类名_方法名(与后面调用so文件的方法很重要)需要在sdk-tools下载ndk和cmake。
2024-11-27 10:48:36
766
原创 Android开发|关于Okhttp发送网络请求
OkHttp提供了网络拦截器和应用拦截器,允许你在请求发送之前或响应返回之后对请求和响应进行处理,可以用于修改请求头、添加日志、全局错误处理等。OkHttp支持同步和异步请求方式。同步请求会阻塞当前线程,直到请求完成;OkHttp是一个流行的开源HTTP客户端库,主要用于在Android和Java应用程序中进行网络操作。OkHttp提供了完善的缓存机制,可以很容易的为应用添加缓存支持,从而减少网络请求量,提高响应速度。OkHttp提供了简洁和直观的API,使开发人员可以轻松的进行HTTP请求。
2024-11-12 17:42:27
589
原创 Android开发|关于LiveData、ViewModel、DataBinding理解和使用
ViewModel 持有应用的数据并且在数据变化时更新视图,而 LiveData 用来观察数据变化,Data Binding 则简化了数据和视图的绑定过程。这种组合大大提高了代码的可读性和维护性。在MVVM架构中,通常会在XML布局文件里直接绑定ViewModel的数据。这使得界面更新与数据变化之间的耦合度较低,从而提高代码的可维护性和测试能力。databinding是安卓的一个库,允许使用xml文件将数据绑定到布局中的UI组件。结合使用可以帮助实现数据和UI分离,提高代码的可维护性和响应性。
2024-11-12 14:23:27
792
原创 Android基础知识整理一
所以onCreate的参数Bundle savedInstanceState一般情况下是null 如果活动在被系统回收之前有通过onSaveInstanceState()这个方法保存数据,这个参数会带有之前保存的全部数据(键值对形式)设计这个小需求主要是了解安卓的开发流程以及一些布局中的例如flowlayout和button等样式的深入理解。Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行 的动作,还可以在不同组件之间传递数据。用于项目实际依赖项的解析。
2024-11-06 17:27:50
930
原创 Android Studio简易项目|随机选择器(类似转盘)
添加flowlayout,以及设置可见性,加强了对android studio项目中的textview edittext button的更深的认知,点击触发条件等,以及对constraintlayout,linerlayout和flowlayout也有了更深刻的认知。为了强化对flowlayout流式布局的理解和简易安卓项目架构结构的理解,写一个小项目,随机选择器,控制可见等。资源文件和mainfest还有工具类不作详细解释。
2024-10-14 17:39:43
431
原创 连接二进制表示可形成的最大数值(Java)418周赛第一题
在Java中给定一个整数可以用Interger.parseInt(a,2) 2表示为二进制。,请你返回可以由这种方法形成的。连接数字的二进制表示,得到结果。nums恒定是三个元素,长度为3.(在这里是二进制)解析为整数。,这是 30 的二进制表示。任何数字的二进制表示。
2024-10-08 15:29:28
338
原创 Java八股|MySql系列
覆盖索引:在某个查询里面,索引 k 已经“覆盖了”我们的查询需求,称为覆盖索引。覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。索引下推:MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
2024-09-10 10:58:29
787
1
原创 Springboot|返回公共类结果&多表查询
注意一下Controller类的返回值类型即可。把多表查询重合的字段重新定位为新的实体类。实体类中加入写好的公共返回类。mapper接口往常一样定义。定义Controller类。
2023-02-03 13:14:54
560
原创 训练营day22|二叉树(二叉搜索树的最近公共祖先|插入操作|删除节点)
235.二叉搜索树是有序数组,找到cur节点在p和q结点值中间,则cur节点则是结果。
2022-12-26 14:30:10
222
原创 训练营day21|二叉树(二叉搜索树的最小绝对差/众数|二叉树的最近公共祖先)
而在有序数组中,我一开始担心的就是虽然用cnt记录了当前数出现的次数,但是我如何才能知道,什么时候cnt是最大值,我要把这个数放进结果集里面?双指针方法,利用一个指针pre在递归中记录上一个指针,point:pre初始化为null。分为两步骤,一部分计算当前的cnt就是当前这个数出现的次数。二叉树的最近公共祖先,需要回溯遍历整个树,然后把结果返回给头结点。在普通树上进行搜索,将中序遍历数组放在map里面统计数和个数。差值是一个正数,其数值等于两值之差的绝对值。2022.11.27补。
2022-11-27 16:16:56
427
原创 训练营day20|二叉树(最大二叉树|合并二叉树|二叉搜索树中的搜索|验证二叉搜索树)
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。利用long的min值的主要原因是LeetCode的测试案例有int类型的min值故采用long的min值。给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。递归方法,基于二叉搜索树的特性,左子树的值根节点的值。而且二叉搜索树在中序遍历后的数组中呈单调递增,利用这个特性来写递归函数。
2022-11-26 14:26:40
366
原创 训练营day18|二叉树(找树左下角值|路径总和|中序和后序构造二叉树)
卡了好久以为自己思路有误,因为打印出来paths的全路径出不来,只能出第一个,还以为是在递归过程中出现了什么问题(但是总体思路在上一题的基础上,计算每一次路径的和,以及回溯不仅在paths要移除那个数,并且在和的基础上药减去那个数的值)。寻找二叉树中符合目标值的路径是否存在,point这边递归中的参数,count,是与targetSum的差值要减去当前结点的值,去判断最后是否为0.以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。还是不太会以后补代码。
2022-11-24 14:36:21
233
原创 训练营1007|二叉树(平衡二叉树|所有路径|左叶子之和)day17
自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。一开始debug没有通过的版本是将高度差不超过1直接return true,然后最后return左右子树是否是平衡子树,这边错误的原因是,如果高度差不超过1走if逻辑的话,可以走最后是否是平衡子树逻辑的就是高度差会超过1的时候。注意:短路或的优化,先判断左子树是不是平衡的,要是左子树不是平衡的也没必要去判断右子树是否平衡。平衡二叉树:左右子树的高度差不超过1.2022.11.23补。
2022-11-23 10:58:30
451
原创 训练营1006|二叉树(最大深度|最小深度|完全二叉树结点个数)
所以我们的最小深度,到达的是叶子结点,是左右都为空的结点,这个也是跟最大深度的不同点。在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。这边感觉有点坑的就是,如果这个二叉树是一条链,最小深度应该还是长度。如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。迭代----->利用层次遍历,每一层cnt++2022.10.23补。
2022-10-23 17:31:11
682
原创 训练营1005|二叉树(层序遍历|翻转|对称)
深度优先------>递归。简化递归的想象过程,如果只有一个结点,就是a树,b树去判断这个结点空吗,如果不空就要判断值。然后递归开始,是因为如果结点多了起来,一样的去判断。层序遍历----->利用队列,每一层每一层的放进去,因此我们判断循环是否结束的条件是,queue里面是否为空。利用层次遍历,在层次遍历的基础上,每次从队列中取出两个数(两根树压进去的结点值)。检查是否对称,无论是递归还是迭代,,即在a树,b树的基础上,各看一半。广度优先遍历----->迭代。这边不可以少任何一组,2022.10.23补。
2022-10-23 14:44:03
145
原创 训练营1004|二叉树(递归遍历|迭代遍历|统一迭代)
平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。那么链式存储方式就用指针, 顺序存储的方式就是用数组。顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在散落在各个地址的节点串联一起。跟前序一样的模拟的是一个进栈和出栈,区别就是什么时候把栈里面的元素加入结果集呢?,直到压到空的时候,node变为现在。,而中序,左孩子先遍历,所以。
2022-10-22 15:52:53
180
原创 训练营1003|栈与队列系列(逆波兰式|滑动窗口最大值|前k个高频元素)
小顶堆能够保证队头元素是最小的,当queue里面的元素个数超过k并且当前要加的元素,比队头元素的值要大,就把队头元素弹出,并且把这个数加进queue里面,优先队列会自动帮你排序,不需要担心顺序问题。
2022-10-13 20:43:15
148
原创 Java八股|大纲(Java基础|集合|多线程|JVM|Redis|MySql)
这个要从java的内存机制去分析,首先当你 New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的(带有static修饰的静态函数)的代码,然后。所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于堆内存中,this关键字一般指该对象,但是如果没有 new对象,而是通过类名调用该类的静态方法也可以。
2022-10-10 21:39:19
3038
原创 训练营1001|栈与队列系列(互相实现|有效括号|删除相邻重复项)
232.首先如果用栈和队列互相实现的话,都是用两个。并且栈和队列可以互相转化,所以图的深度优先遍历还是广度优先遍历都是可以使用栈和队列实现的。然后还有一些细节需要care,在pop的时候就要先将stackIn里面的所有数据都倒进stackOut里面,然后pop数出来。
2022-10-10 13:01:43
176
原创 训练营0930|字符串(重复的子字符串|字符串总结|双指针)
在字符串章节,常见的库函数比如,valueof,substring,fill,contain等要熟练,并且字符串这边整体翻转然后再局部翻转的思想。并且字符串的大头KMP算法,包括两大部分,next数组,以及具体查找的时候是怎么跳的,一定要掌握清楚。双指针算法在翻转字符串,还是滑动窗口这边都有一个广泛的应用,以及去找倒数第k个结点(链表),使用快慢指针的操作要熟练。2022.10.09补。
2022-10-09 12:27:18
226
原创 训练营0929|字符串KMP算法
KMP还是磨了蛮久的,其实说实话写到现在说很懂也不能算,不过大概过程分为两部分,next数组求解,和整体求解。此间有最长公共前后缀来构建next数组,而next数组的解法可以动态规划优化,并且代码里面我采用的是cn标注去参考的前缀处地方,有的参考代码直接省去了这个步骤直接用的j。包括整体求解的时候,i不动,j往前动,动到next数组的下标。之后复习的时候还得再多轮几遍2022.10.08补。
2022-10-08 17:55:22
271
原创 训练营0928|字符串系列(反转I|反转II|替换空格|翻转单词|左旋转字符串)
其实本来第一反应是转成char数组去做,但是空格要转成“%20”并不是一个字符,之后想到是否可以用buffer的replace直接做。然后看了别人的思路之后发现利用char数组的话可以先扩容,然后利用双指针,一个指向扩容之后的结尾,一个指向本来的结尾,进行数据填充。但是如果空间复杂度为O(1)的话不使用额外空间只在原字符串上面操作----->使用整体翻转然后局部翻转的策略。,慢指针维护边界,快指针去找符合的字符,然后每多个空格添加单个空格。看了解析之后如果空间复杂度为O(1)的话,可以使用快慢指针,即。
2022-10-08 10:40:02
201
原创 训练营0927|哈希表系列(四数相加|赎金信|三数之和|四数之和)
四个数组里面寻找四个数相加和为0.巧妙的去利用hashmap判断是否存在的功能,hashmap1里面放前两个数组的和,以及这个和出现的次数。双指针的思想,以及如何去重------>注意相等之后对right和left的去重并且right--和left++避免内存溢出。四元组的和为target即在三数之和的基础上,再加上一层for循环,并且剪枝的条件要相比于三数之和的基础上更为复杂些。hashmap2里面放后两个数组的和(或者和的相反数)----->判断是否存在于hashmap1里面。2022.10.03补。
2022-10-03 15:02:06
213
原创 训练营0926|哈希表系列
面经:==是位运算符,equals是方法,==只是单纯判断值是否相同,引用地址的指向是否同,而可以通过重写equals去判断对象内部。重点是重复的key怎么将其合理的放进hashmap里面并且后面的值不能把前面的覆盖。把两个数组里面的数以及他们出现的个数放进hashmap里面,然后去找相交的部分。1.两个重复的值和为target------>在put之前进行判断。2.两个重复的值和不为target-------->取谁都一样。只能说论一个==与equals的区别对人的折磨有多大。
2022-09-30 18:23:17
151
原创 训练营0924|链表系列(两两交换/倒数删除/链表相交/环形链表)
快慢指针,fast走两步,slow走一步,然后fast和slow如果走不到头的话,就是有环,有环返回相交的第一个结点。*之前听过不少算法课,感觉在链表这边用快慢指针还是特别频繁的,包括判环,判相交。,快指针先走n步,然后慢指针和快指针同时移动,最后快指针暂停的位置,慢指针便是要移除的数。再者还有一个point就是空指针,我经常会遇到空指针的异常,所以如何避免是很重要的。第一反应就是暴力做法,先遍历一下知道他有多少个结点,然后正向删除。本题主要是模拟指针交换的过程,重点还是之前说的,
2022-09-25 11:07:39
192
原创 训练营0923|链表(移除,设计,反转)
这道题看上去特别简单,我一上来就是个cur遍历然后不就是但是本题重点是边界的处理,中间部分移除是很简单,头部呢,尾部呢,这个是我没有考虑到的地方或者也可以使用虚拟头结点707.这一题的index是真的折磨人。以及找结点的前一个还是本人真的要考虑清楚,一个删除结点中i的遍历范围的bug找了好久。
2022-09-24 09:50:15
192
原创 训练营0922|数组系列
看见题目的第一反应就是暴力解法,挨个平方之后排序但如果说要用双指针我就很懵,双指针?slow和fast的话两者是什么意义?想了一下还是没想通最后索性去看讲解了如果一个数组有序,包含负数的话,平方之后最大数的出现肯定是原始数组两端的数,然后两指针逐渐往中间缩。当然这还有一个前提就是,不去合并平方后的值相同的情况。当然就算要合并,也变成的题了。利用双指针缩窗口里面的值看是否满足条件(本题中是和值>=target)right指针一直外扩,扩到符合条件的时候去缩left指针。
2022-09-23 09:27:01
321
原创 动态规划系列
在LeetCode上刷动态规划刷到崩溃,因为一个=没过AC找了半天毛病,本来都不打算写blog了,但是这么痛苦还是记录一下这几天对动态规划的浅浅的理解,以及刷题感悟。毕竟动态规划这个系列的问题还是很重要的,彻底理解还是需要很多的时间,不能光一边掰苞米,一边扔苞米首先适用于动态规划的场景:将一个规模比较大的问题划分为k个子问题,但是这也是动态规划区别于分治算法的一个很重要的部分。
2022-09-11 18:32:20
371
原创 LeetCode检查相同字母间的距离(第309周赛第一题)
得到相同字符之间距离之后,就要在distance数组之中比较是否相等,不相等的话则break掉并且直接返回false,但是倘若要是能直接跑下来,就证明都是相等的,所以将flag的初始值置为true。输入:s = "abaccb", distance = [1,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]字母表中的每个字母按从 0 到 25 依次编号(即,'a' -> 0, 'b' -> 1, 'c' -> 2, ... , 'z' -> 25)。
2022-09-05 14:55:59
253
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人