- 博客(185)
- 资源 (12)
- 问答 (1)
- 收藏
- 关注
原创 字节跳动春招——雀魂启动
给人造成了无解,让人误认为剩下的12张牌中都是顺子或刻子,而且例子中也这样体现出来的,所以按照这个逻辑写代码,一定是错的。1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀头,组123,123,567,789的四个顺子,可以和牌。1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以组成1,2,6,7的4个刻子和9的雀头,可以和牌。现在,小包从36张牌中抽取了13张牌,他想知道在剩下的23张牌中,再取一张牌,取到哪几种数字牌可以和牌。可以组成1,2,6,7的4个刻子和9的雀头。
2023-05-31 17:21:50
63
原创 字节跳动春招——聪明的编辑
万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。要是不行,干一行不行一行,一行不行行行不行。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC。2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello。
2023-05-24 14:18:09
375
原创 天然蓄水池
经过分析,选取s[1]和s[8]时,水库蓄水量为15;同样选取s[1]和s[6]时,水库蓄水量也为15。例如,当山脉为s = [3, 1, 2]时,则选取s[0]和s[2]作为水库边界,则蓄水量为1,此时输出:0 2:1。选取山脉上两个点作为蓄水库的边界,则边界内的区域可以蓄水,蓄水量需排除山脉占用的空间。经过分析,选取s[1]和s[6]时,水库蓄水量为19(3 + 7 + 4 + 5)如果无法蓄水,则返回0,此时不返回边界。当山脉`s = [3, 2, 1]时,不存在合理的边界,此时输出:0。
2023-05-07 15:55:32
372
原创 最小调整顺序次数(特异性双端队列)
有一个特异性的双端队列,该队列可以从头部到尾部添加数据,但是只能从头部移除数据。小 A 一次执行 2n 个指令往队列中添加数据和移除数据, 其中 n 个指令是添加数据(可能从头部也可以从尾部添加) 依次添加 1 到 n , n 个指令是移出数据 现在要求移除数据的顺序为 1 到 n , 为了满足最后输出的要求, 小 A 可以在任何时候调整队列中的数据的顺序 请问,小 A 最少需要调整几次才能满足移除数据的顺序正好是 1 到 n。
2023-05-01 08:45:44
25
原创 开心消消乐
解题思路:遍历二维数组,遇到某个位置的值为1,则开始查找它周围8个方向的位置的值,如果是1,置为0。然后继续遍历下一个元素。第一行输入两个整数,分别表示矩阵的行数 N 和列数 M,取值范围均为 [1,100]接下来 N 行表示矩阵的初始值,每行均为 M 个数,取值范围 [0,1]读取输入数据代码略,直接使用定义好的数组。输出一个整数,表示最少需要点击的次数。
2023-04-29 11:27:32
673
原创 Android:URLEncoder空格被转码为“+”号
另外,Android提供了Uri.encode,虽然可以正常转码空格,但是它不需要转换的字符和URLEncode有一点差别,大家在用的时候,根据情况选择即可。但当使用URLEncoder时,会发现字符串中的空格被转换成“+”号,如果编码后的内容入库后,将导致读取时,前段本来是空格的地方,会显示成“+”号字符。Android前段和后端接口交互时,经常会遇到特殊字符,比如表情、特殊标点等,这样在Url中是无法识别的,需要进行转码,后端进行解码交互。建议自己仿照官方的代码,写一套自己转码和解码过程,这个不难的。
2023-01-09 10:04:13
970
原创 Glide:EngineResource
这个队列是用来创建ResourceWeakReference对象的,是对EngineResource的弱引用。EngineResource是一个资源包装器,实现Resource接口,运行资源计数。在ActiveResources中,有对它的引用队列。先来看看EngineResource的属性。
2022-11-14 10:18:23
239
原创 Glide:DecodeJob
参阅这个类的作用是,对缓存中数据或者原始资源进行解码、转换等操作,可以理解为一个作业,由EngineJob启动,内部通过相关对象对资源进行处理。先来看一下内部的枚举定义。DecodeJob在Engine中的waitForExistingOrStartNewJob方法中,由DecodeJobFactory创建,并执行DecodeJob的init方法。init方法中会初始化decodeHelper对象。
2022-11-09 10:30:06
262
原创 Glide:DecodeHelper
这个过程会传入一堆的参数,如用来加载图像的组件的长和宽,缓存策略,资源对象类型,优先级等等,就不再一一说明了。DecodeHelper是作为解码作业DecodeJob的助手类,用来获取解码相关对象或属性信息的。它的初始化方法init是在DecodeJob的init中调用的。这个类里包含两个枚举类型。
2022-10-27 15:03:27
191
原创 Glide:EngineJob
EngineJob这个类是用来通过添加和移除回调,来管理一个load过程,当load完成时,通知回调。EngineJob是在Engine类中,通过EngineJobFactory创建的。参考。先来看看EngineJob中的属性。ResourceCallbacksAndExecutors是一个内部类,管理资源加载的回调和相关线程。实现了Iterable接口。内部有一个List集合。用来保存ResourceCallbackAndExecutor对象(注意这个末尾不带“s”)。
2022-10-20 15:31:15
423
原创 Java:对象池Pools
当我们创建了一些对象,又希望在某些时候重复使用,这样可以避免对象的频繁创建和引起垃圾回收,提高使用效率。这时,对象池就可以帮我们处理这个事情了。比如创建了几个数组,那我可以先把他们保存起来,需要使用时,从池子里取出来,存放新的数据或者复用数据都是可的。对象池的代码也相对简单,具体来看一下:Pools是一个final类。它里面有一个接口。Pools.java文件中包含两个静态类。
2022-10-17 16:02:41
180
原创 Glide:ActiveResources
文章中,我们多次看到了ActiveResources这个对象,我们可以理解为活动的资源,今天就来分析一下ActiveResources的代码。这是一个同步方法,根据key,先从弱引用队列中移除掉该资源,并返回该资源。如果这个资源存在,则执行资源重置。资源监听是被定义在 EngineResource类中,Engine实现了这个接口。ResourceWeakReference 是一个内部类,维护弱引用资源对象。来看activeResources.deactivate。
2022-10-14 14:24:25
55
原创 Glide:Engine
这篇文章就来介绍一下Engine 这个类。Engine是负责开始加载和管理活动的以及在缓存中的资源。它实现以下三个接口。分别看一下这这三个接口。
2022-10-12 14:31:42
65
原创 Glide:Registry
在上一篇中,我们提到了,通过自定义的Module,可以替换掉Glide默认的组件,比如网络框架,这里就涉及到Registry这个类了。Registry这个类是用来管理Glide中注册的组件的,比如加载、解码、编码等,可以扩展和替换。我们先来看看它里面有些什么。这里只介绍各自负责的功能,具体的代码会陆续讲解。上面这些目前还是比较晦涩的,后面会慢慢展开来讲。Registry对象是在Glide的构造方法中创建的。我们看看Registry的构造方法。
2022-10-11 14:17:07
45
原创 Glide:AppGlideModule
上面代码中,getAnnotationGeneratedGlideModules方法就是创建GeneratedAppGlideModuleImpl这个类的,GeneratedAppGlideModuleImpl类自动生成的位置在build目录下。开发人员就可以自己去控制了。那GeneratedAppGlideModuleImpl这个类是什么时候被用到的呢,我们回到Glide.java中,加入我们使用下面代码。加入我也不想用okHttp,我想自己写一个网络请求,让Glide使用可不可以,当然可以。
2022-10-10 14:52:10
167
原创 Glide:GlideBuilder
annotationGeneratedModule 是可以通过注解方式,自动创建的,用户可以通过自定义的Module来设置一些选项或者注册自己的组件,比如使用自己的网络组件,这个后面会讲。Builder中的这些设置,我们都可以通过自定义的AppGlideModule子类的applyOptions方法进行设置。从名字看,大家应该不会感到陌生,这是Android中经常会遇到的Builder模式,它为Glide提供了默认的配置。这些过程完成后,就会调用Builder的build方法创建Glide实例了。
2022-10-09 14:32:51
129
原创 初始化:Glide.java
该方法,返回RequestManagerRetriever对象,RequestManagerRetriever是一个提供了一些静态方法,用来创建com.bumptech.glide.RequestManager实例,并可以在activity和fragment中检索对应的com.bumptech.glide.RequestManager对象。在Glide内部,定义了一个私有的静态变量glide,看上面的代码就很清楚的看到,Glide内部使用的是单例模式。在get方法中,使用了检测双锁的机制,来创建单例。
2022-10-09 14:32:36
177
原创 Glide环境搭建
当然如果我们要对Glide做一些全局的设置,或者替换已有的框架,比如想把网络框架替换为自己的(如okhttp,volley等),这些后面会陆续讲解。上面就是一个最基本的应用,从网络下载一个图像,然后显示到imageView中。使用Glide,需要引入几个包,在gradle文件中引入。有了上面的内容,Glide最常用的功能就可以使用了。Glide.with有很多重载,后面我们会详细说。这些设置在RequestOptions中体现。Glide的gitHub地址。
2022-10-09 14:32:16
76
原创 Java:从字节码看Enum类型
从以上字节码我们看到,它会为每个枚举值创建一个对象,保留名字和对应的值,还要创建一个数组来保存所有的枚举,相比一个int类型的数值来说,确实比较占用内存。枚举类型对于我们访问非常的方便和清晰,但是却有很多同学是不建议多多地使用枚举类型,原因就是枚举类型还是比较占用内存的。接下来我们看static这段,这是初始化的工作,大概的流程就是调用Enum的构造方法,创建数组,保存三个枚举值,具体看注释吧。然后就是,我们定义的one,two,three三个枚举属性,在这里也看到了,分别定义为Test类型。
2022-09-27 15:18:35
290
原创 Android:RecyclerView的ChildHelper
RecyclerView作为我们常用的数据列表展示组件,它可以包含若干的子视图(child),那就会涉及到添加、删除、隐藏、查找等等操作,所以Android SDK提供了一个专门负责管理RecyclerView子视图的类,就是ChildHelper类。今天我们就来看看ChildHelper的源码实现。它的官方说明如下:大概的意思就是说,ChildHelper是用来管理子视图的,它包含一对子视图的操作功能。
2022-09-19 09:51:27
514
原创 Dialog and WindowManager$BadTokenException
在Android的开发中,Dialog的使用已经非常的频繁,在使用过程中,我们需要留意一些细节,不然就会导致诸如下面的错误发生。那今天我们就来分析一下,在开发中,导致这种错误的常见的操作。Dialog的创建需要一个上下文Context,内部需要根据这个Context创建一个PhoneWindow。当我们在一个Activity中使用Dialog时,Context通常就是所属的这个Activity对象。如果报错,也就是这个Activity上下文出现了问题。你要保证Activity是正常活动状态才行。
2022-07-04 14:43:35
451
原创 supportRequestWindowFeature(AppCompatActivity)
AppCompatActivity,标题栏,Actvity
2022-06-02 09:21:58
268
原创 Android项目中嵌入Cocos游戏项目
Cocos的生态相比Unity要逊色很多,网上搜索的各种文章,基本都是比较早期的,无法在较新版本环境中使用,这里以Cocos 3.3版本为例,讲一下在自己的Android项目中嵌入Cocos项目。一、创建Cocos项目(略)。二、编译Cocos Android工程。需要下载NDK。在偏好设置中,设置路径。Cocos菜单中选择“项目——构建发布”,弹出如下界面。我已经创建了一个名字为android的构建任务,大家可以新建一个。“build”是 工程构建的目录,“..
2022-03-23 14:18:59
8763
2
原创 Java:ArrayBlockingQueue
ArrayBlockingQueue是一个有界队列,执行先进先出(FIFO)原则,它是固定大小的,一旦创建,容量就不能被修改。先对部分属性和方法进行简单说明。属性items 内部保存对象的数组,这个数组创建后,大小就不会改变了,即使添加和取出元素,都不会影响数组大小,只不过对应位置会被改写 takeIndex 下一个被检索的元素的索引,初始为0,每取出一个元素,+1 putIndex 下一个被添加的元素的索引,初始为0,每添加一个元素,+1 count 队列的数量
2021-12-16 14:37:29
1197
原创 Java:ThreadPoolExecutor中的Worker
在文章《从源码看ThreadPoolExecutor的执行步骤》中已经讲过了ThreadPoolExecutor的执行步骤,里面提到了一个内部类Worker,它就是负责具体执行任务的,今天就来说说它。private final class Worker extends AbstractQueuedSynchronizer implements Runnable{ //worker的工作线程,如果创建失败则为null final Thread thread;
2021-12-14 09:45:51
251
原创 Java:从源码看ThreadPoolExecutor的执行步骤
提起线程,几乎每个人都知道,但是真正使用线程的确实不多。线程让许多人感到畏惧。在平时的工作中,使用线程,很多时候就是new一个Thread去start,当看到线程池ThreadPoolExecutor创建时的一堆参数,更是一头雾水。接下来的内容,我们就从源码看看ThreadPoolExecutor的工作流程,让你感到其实它很友好????。先看一张ThreadPoolExecutor的工作步骤图。我们来创建一个线程池的执行代码。int taskCount = 41;AtomicInte
2021-12-13 16:22:45
404
原创 Android:从源码看onSaveInstanceState的调用条件
Called to retrieve per-instance state from an activity before being killed so that the state can be restored in onCreate or onRestoreInstanceState (the Bundle populated by this method will be passed to both).This method is called before an activity may ..
2021-12-08 10:44:09
80
原创 Android:Instrumentation
先看一下官方的对Instrumentation的说明:Base class for implementing application instrumentation code. When running with instrumentation turned on, this class will be instantiated for you before any of the application code, allowing you to monitor all of the interact
2021-12-07 09:26:21
2481
原创 Android:ActivityTaskManagerService接管ActivityManagerService
ActivityManagerService这个服务,对于玩Android的开发人员,应该再熟悉不过了,它是掌管Activity的核心。不过从Android 10.0(API 29)开始,再看ActivityManagerService的代码,会发现,ActivityManagerService的工作已经被ActivityTaskManagerService这个服务接管了。具体我们就看看这里的变化。虽然说ActivityTaskManagerService接管了ActivityManagerServ
2021-12-01 16:50:28
3403
原创 Android:EditText长按选词的过程
在前面我们研究过下面两篇文章:《看看Android源码中View是如何实现LongPress的》《Java:BreakIterator是如何取词的》那么在Android组件EditText中,当我们点击在某个文字位置时,长按,就会选中匹配的词语。如图:这个过程其实就是上面两篇文章内容的综合运用,下面我们就来看看实现过程。既然是在长按事件中触发的,那就直接定位到TextView的performLongClick方法,如果是EditText,则TextView中的如下变量可用.
2021-11-29 14:46:30
2187
原创 Java:BreakIterator是如何取词的
BreakIterator是Java提供的一个用来判断语言边界的类。给定一个字符串和一个索引位置,BreakIterator可以根据本地语言边界限定规则,找到这个索引前后,可以和它组成词语或句子的字符的索引,我们可以根据begin和end索引来获取这个单词。比如下面的字符串:Hello World当指定索引8时,也就是字符o和r之间时,用BreakIterator去分词,就可以得到World这个单词。看下面的图就能看到了。BreakIterator提供了四种边界判断getWord.
2021-11-25 10:37:11
532
原创 看看Android源码中View是如何实现LongPress的
除了最常用的点击事件(Click),还有一个长按事件(LongPress),比如长按弹出复制、粘贴的菜单,长按弹出自定义View等等。这篇文章我们就来看看Android源码中是如何实现长按事件的。既然是手势动作,那就逃不过onTouchEvent。直接找到View代码中的onTouchEvent。这个时间里面,首先会检查几个是否可点击的状态,比如点击、长按、环境点击(触笔、鼠标右键等)。final boolean clickable = ((viewFlags & CLICKABLE)
2021-11-23 09:19:06
1727
原创 Android:从源码看权重Weight的计算
一个Layout中,放置几个TextView,然后对每个TextView设置不同的宽度比例,设置权重属性layout_weight就是我们最常用的一个功能。弄明白权重的计算,有助于我们更精准的布局。假设有如下布局,我们考虑子控件的width都是match_parent,权重比为1:2:2。屏幕宽度为1080。 <LinearLayout android:layout_width="match_parent" android:layout_height="
2021-11-19 16:36:29
979
原创 在Mac M1芯片下使用Android Studio模拟器
相信很多朋友都被Mac电脑的M1芯片坑了一把,很多诸如Docker、VirtualBox、Genymotiion、甚至连Android Studio自带的模拟器都无法使用了。好在各厂商都在努力解决这个问题。Android Studio的使用,可以下载专门为M1新版开发的版本。链接如下:https://redirector.gvt1.com/edgedl/android/studio/install/2020.3.1.25/android-studio-2020.3.1.25-mac_arm.dmg安
2021-11-19 10:34:08
8914
5
原创 扩展.net日志框架Serilog的WriteTo
Serilog作为日志框架,是一个不错的选择,ASP.net Core提供了很多关于Serilog的NuGet包,可以让你把日志输出到文件、控制台、数据库等。对于入库的日志,NuGet包提供的操作比较有限,有的甚至无法自定义字段,所以使用起来就不是那么友好了。所以我们需要对WriteTo进行扩展,写入我们自己的数据库表,自己的字段,采集我们需要的信息等等。这里需要用到.Net的类扩展功能。看看WriteTo是什么类型。public LoggerSinkConfiguration WriteTo
2021-11-18 16:14:11
1212
原创 JQuery的table2excel.js导出到Excel导致科学计数法问题的解决方法
打开table2excel.js文件,找到Plugin.prototype节点,修改mid节点内容,原始样式如下mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>",现在我们给它加上样式,解决科学计数问题。mid: "</x:ExcelWorksheets></x:ExcelWorkbook><
2021-09-14 15:53:08
828
1
原创 VUE:No PostCSS Config found 解决
通过npm安装后,在vue中引用时,比如:import 'font-awesome/css/font-awesome.min.css'有时会遇到No PostCSS Config found的错误信息,网上这类大都是说在项目根目录下创建postcss.config.js文件,内容如下:module.exports = { plugins: { 'autoprefixer': { browsers: 'last 5 version' } }}当创建后,依然
2021-03-23 15:11:14
3394
1
原创 Android:让我们来写一写Binder
Binder作为Android中跨进程通信的一部分,在源码中是起了极其重要的作用。比如ActivityManagerService,就是通过Binder来控制Activity的操作。至于Binder的通信,很多文章都是通过创建AIDL工程,由工具自动生成代码,就会看到诸如Stub、Proxy等内部类,看的是一头雾水。所以要想明明白白的使用Binder,自己手写一遍,对理解是非常有效的。以下以在两个进程间通信为例来写一个Binder。客户端首先定义一个接口,包括Binder标识,发送Transac
2021-03-12 14:16:06
345
Android stodio的编译速度太慢,这个有没有提高的途径
2016-08-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人