自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(103)
  • 问答 (2)
  • 收藏
  • 关注

原创 Retrofit踩坑日记:response.body().string()只能调用一次

问题:我打算将服务器返回的json数据进行解析,解析出来的对象一直是空,我还以为我导入的GSON库有问题,气死了。贴上错误代码 public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { try { Log.d("RetrofitActivity", response.b

2021-06-07 17:31:52 1158 1

原创 Android实践技巧

Android实践技巧一、随时随地退出程序比如我打开了一个Activity,接着又打开第二个Activity,然后又打开第三个,当我想退出程序时需要按下三次Back建才能退出,有一个方案可以让我们随时随地退出程序新建一个ActivityCollector类作为活动管理器我们通过list来存储活动,当我们新增一个活动时就调用addActivity方法,摧毁一个活动时就调用removeActivity方法,如果想要退出程序就调用finishAll方法关闭所有活动。如果你还想要杀掉当前进程,就调用an

2021-05-11 14:06:03 247 1

原创 学习Material Design总结

学习Material Design总结一、Toolbar比起普通的Actionbar,Toolbar更加灵活,也有很多功能,比如在标题栏显示当图片的按钮,自带返回按钮。二、滑动菜单要实现这种效果就要利用DrawerLayout布局,该布局中允许放入两个直接控件,第一个是主屏幕中显示的内容,第二个是滑动菜单中显示的内容。<?xml version="1.0" encoding="utf-8"?><androidx.drawerlayout.widget.DrawerLayout

2021-05-09 14:50:27 246

原创 LeetCode 1720. 解码异或后的数组

LeetCode 1720. 解码异或后的数组主要是利用异或运算的性质:异或运算满足交换律和结合律;任意整数和自身做异或运算的结果都等于 0,即 x⊕x = 0;任意整数和 0 做异或运算的结果都等于其自身,即 x⊕0 = x;class Solution { public int[] decode(int[] encoded, int first) { int length = encoded.length + 1; int[] arr = new int

2021-05-06 13:53:25 118

原创 NotificationCompat.Builder过期的解决方案

NotificationCompat.Builder过期的解决方案我们之间这样定义是会报错的。Notification notification = new NotificationCompat.Builder(MainActivity.this)解决方案是要创建一个通知渠道,并将通知渠道的id传入Builder()String id = "channel_01";//构建NotificationChannel实例 NotificationChannel notificationChannel

2021-05-04 21:15:02 798

原创 litepal的使用以及用adb查看数据库的方法

litepal的使用以及用adb查看数据库的方法litepal的使用1、导入依赖implementation 'org.litepal.android:core:1.3.2'2、创建一个名为assets文件夹,并创建litepal.xml文件,配置litepal.xml文件<?xml version="1.0" encoding="utf-8" ?><litepal> <dbname value="BookStore" ></dbname&gt

2021-05-03 16:45:50 1036

原创 Fragment小记

Fragment小记1、创建Fragment先创建fragment的布局文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android

2021-04-27 16:04:24 87

原创 LeetCode 1011.在D天内传送包裹的能力

LeetCode 1011.在D天内传送包裹的能力根据官方题解的理解:先计算出最低载重量的范围,依题意得,船的载货量最少为货物重量的最大值,最多为所有货物重量之和。我们在这个范围内利用二分查找算出最低载重量,使得刚好在D天内运完所有货物。二分查找:1.在当前载货量下需要多少天运完 int need = 1, cur = 0; //need为所需天数,mid为当前载重量 for(int weight : weights) { if(

2021-04-26 16:19:33 95

原创 Spinner组件

Spinner组件1、在xml布局文件中添加Spinner组件下拉列表的item通过资源文件指定android:entries="@array/hobit"hobit是我们自己在资源文件中创建的数组名,其中包含如下内容<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="hobit"> <item>全部</item>

2021-04-24 16:51:55 224

原创 GridView组件的简单使用

GridView组件的简单使用1、利用数据适配器将数据填充到GridView中2、数据适配器AdapterArrayAdapter(适用于数组,将数组的值包装成多个列表项,通常只能显示一行文字)SimpleAdapter(适用于list列表,将list的值包装成多个列表项,可以自定义多种效果)SimpleCursorAdapter(适用于数据库,将数据库的内容以列表的形式展现)BaseAdapter(自己定制)这里以SimpleAdapter为例,它的构造函数需要五个参数,分别是cont

2021-04-24 14:00:27 411

原创 利用ImageSwitcher实现左滑右滑查看图片

利用ImageSwitcher实现左滑右滑查看图片1、设置ImageSwitcher的初始图片imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() { //设置初始图片 @Override public View makeView() { ImageView imageView = new ImageView(MainActivity.this);

2021-04-23 21:33:39 700

原创 LeetCode 11.盛最多水的容器

设置双指针 i,j 分别位于容器壁两端,根据规则移动指针,水槽面积公式 S(i, j) = min(h[i], h[j]) × (j - i),我们让height[i]和height[j]中较短的向里移动一格,重新计算面积。以次反复。为什么是较短的向里移动呢?看公式S(i, j) = min(h[i], h[j]) × (j - i),不论是i还是j向里移动(j-i)都会减一,所以水槽面积大小取决于min(h[i], h[j]),当短板向里移动时min(h[i], h[j])可能变大,而当长板向里移动.

2021-04-23 20:35:12 53

原创 LeetCode 5.最长回文子串

LeetCode 5.最长回文子串我能理解的最简单的方法:中心扩展法遍历字符串,以每个字符为中心向两边扩展,同时以两个字符为中心向两边扩展,更新每次扩展后的最大长度。最大回文子串的起始位置=中心位置-(最大回文子串长度 - 1)/ 2,末尾位置=中心位置+最大回文子串长度 / 2,最后返回从起始位置到末尾位置的字符串即可。class Solution { public String longestPalindrome(String s) { if (s == null ||

2021-04-21 17:40:11 47

原创 Activity状态更改

Activity状态更改1、配置发生了更改当配置发生更改时,Activity 会被销毁并重新创建。原始 Activity 实例将触发 onPause()、onStop() 和 onDestroy() 回调。系统将创建新的 Activity 实例,并触发 onCreate()、onStart() 和 onResume() 回调。结合使用 ViewModels、onSaveInstanceState() 方法和/或持久性本地存储,可使 Activity 的界面状态在配置发生更改后保持不变。2、用户点击返

2021-04-20 21:30:27 359

原创 最简单的自定义View方法

最简单的自定义View方法1、自定义一个类继承自view,写明构造函数。2、重写onDraw方法2.1 创建Paint画笔类2.2 加载位图Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.mipmap.role);2.3 绘制位图canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint);其中bitmapX,bitmapY为该view在父控件中的位置2.4

2021-04-11 14:50:10 217 2

原创 Android项目结构

Android项目结构1、清单文件manifests:主要是这个app的配置2、Java文件:项目源代码3、Res资源文件3.1 drawable目录3.2 layout目录:主要是保存布局文件,主要是xml3.3 mipmap目录:存放图标(可选择大小)3.4 values目录:颜色资源、尺寸资源、字符串资源、样式资源R文件报红的解决方法:Build->clean Project...

2021-04-11 14:47:08 76

原创 LetCode2 两数相加

LetCode2 两数相加我的思路:创建一个额外的链表来保存结果,每一位都等于(前两个链表之和+进位)%10,下一步进位等于(两个链表之和+进位)/10,循环遍历链表,直到两个链表都到尾部且无进位时跳出循环。class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int flag = 0; ListNode cur = new ListNode(0);

2021-04-09 20:35:39 62

原创 Android获取本地相册图片

Android获取本地相册图片第一步设置静态权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />第二步选择数据来源/** * 从相册选取图片 */ private void choosePhot

2021-04-08 17:29:03 1767 1

原创 codestyle

来自sun公司的java代码规范1、 标识符命名规范1.1 概述标识符的命名力求做到统一、达意和简洁。1.2 骆驼法则Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: supplierName, addNewContract,而不是 supplier_name, add_new_contract。1.2 英文 vs 拼音尽量使用通俗易懂的英文单词1.3 包名使用小写字母如 com.xxx.settlme

2021-03-21 16:16:25 136

原创 堆排 + 快排 + 归并排序 + 桶排

堆排序第一步,建一个大根堆或者小根堆。第二步,每次将堆顶元素与堆底元素交换,堆元素减1,然后将剩下的元素恢复为大根堆或者小根堆,重复此步骤,直到堆的大小为0这里以大根堆为例:如何建堆:从最后一个非叶子结点(下标为length / 2 - 1)开始调整,自下而上,调整每个结点,当每个结点与其左右节点交换位置时需要考虑其左右节点的子树,因此,还需要调整左右子树。public static void buildMax(int[] nums, int length) { for(int i = le

2021-02-25 15:55:24 79

原创 onRestart方法中无法更新intent解决方法

onRestart方法中无法更新intent解决方法在Activity中重写改方法protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // must store the new intent unless getIntent() will return the old one setIntent(intent); }...

2021-02-17 22:30:32 251

原创 K个一组反转链表

K个一组反转链表只能使用常数的额外空间,因此只能用迭代法。关键点是用for循环,每k个反转一次,每次反转前要记下头结点的前一个结点和尾结点的后一个结点,用于拼接。class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy;

2021-02-15 20:53:25 94

原创 119. 杨辉三角 II

119. 杨辉三角 II我们可以从后往前计算,这样只要一个数组就够了,例如 1 2 1,下一行比这一行对一个数,我们现在末尾加一个0,变成1 2 1 0,开始从后往前推,最后一项等于 0 + 1,倒数第二项变成1 + 2,直到推到第一项为止,第0项一直都是1,所以第0项不需要计算,结果为 1 3 3 1.时间复杂度为O(k^2)空间复杂度为O(1)class Solution { public List<Integer> getRow(int rowIndex) {

2021-02-12 14:03:48 69

原创 剑指 Offer 20.表示数值的字符串

剑指 Offer 20.表示数值的字符串记住一套规则!1、. 判定规则,没有出现过, 且必须出现在e的前面2、e判定规则,没有出现过e 且必须出现过数字,而且e后面必须跟数字3、 +/- 判定规则,只能出现在第一位或者在e后面class Solution { public boolean isNumber(String s) { char[] nums = s.trim().toCharArray(); boolean numFlag = false; //代

2021-02-04 20:39:54 71

原创 剑指 Offer 19.正则表达式匹配

剑指 Offer 19.正则表达式匹配解法:动态规划1、dp数组的含义:dp[i][j] : s的前i个字符和p的前j个字符是否可以匹配。2、dp方程:从最后一个字符出发当字符为正常字符且等于s[i-1]时,则dp[i][j]取决于dp[i-1][j-1]当字符为‘.’时,dp[i][j]取决于dp[i-1][j-1]当字符为‘*’时且q[j - 2] != s[i -1]而且q[j-2] != '.'时,去除掉最后两个字符,看倒数第三个字符,则dp[i][j]取决于dp[i][j-2];

2021-02-04 16:53:00 75

原创 剑指 Offer 67.把字符串转换成整数

剑指 Offer 67.把字符串转换成整数步骤:1、把字符串转为字符数组,同时去掉首尾空格2、判断第一位是否为符号位,如果是则保留下来,从第二位开始遍历3、循环判断当前字符是否为数字,不是数字则停止循环,是数字则加到结果中去4、边界处理,如果当前结果 > Integer.MAX_VALUE / 10或者当前结果等于Integer.MAX_VALUE(2147483647) / 10 并且最后一位大于7, 则根据符号位返回Integer.MAX_VALUE或者Integer.MIN_VAL

2021-02-04 12:50:06 154

原创 剑指 Offer 51.数组中的逆序对

剑指 Offer 51.数组中的逆序对不能用暴力解法!归并排序:在分的过程中将数组拆分到只有一个元素,在治的过程中排序再合并,并且统计逆序对的数量。与归并排序唯一的区别就是加了逆序对的计算,那么怎么计算逆序对呢?当右边的A小于左边的B时,那么A会小于B右边到右边界所有的数,这些数的数量为mid-B的下标+1将每一次归并时这些数量统计起来即为结果class Solution { public int reversePairs(int[] nums) { if(nums

2021-02-03 22:27:39 60 1

原创 剑指 Offer 68 -II.二叉树的最近公共祖先

剑指 Offer 68 -II.二叉树的最近公共祖先思路:跟二叉搜索树不一样,这题只能通过递归回溯解决。对于每个根节点判断它的左右子树是否含有目标节点,分四种情况:1、左右子树都不含目标节点,返回null;2、左子树不含目标节点,右子树含目标节点,返回右子树;3、右子树不含目标节点,左子树含目标节点,返回左子树;4、左右子树都含目标节点,返回根节点。class Solution { public TreeNode lowestCommonAncestor(TreeNode root, Tree

2021-02-03 16:34:50 45

原创 剑指 Offer 68 - I.二叉搜索树的最近公共祖先

剑指 Offer 68 - I.二叉搜索树的最近公共祖先思路:找规律 !如果q,p一个比root大一个比root小,那q,p分布在root的左右两边,且root的左右子节点一定不是p,q的公共祖先,所以p,q的最近公共祖先是root;如果q,p其中一个等于root,那他们的公共祖先就是root;如果q,p同时小于root或者同时大于root,那就要继续向左或向右搜索。迭代法:class Solution { public TreeNode lowestCommonAncestor(TreeN

2021-02-03 15:32:17 65

原创 剑指 Offer 64. 求1+2+....+n

剑指 Offer 64. 求1+2+…+n思路:因为不能用那些运算符,所以就只能用递归做,但是递归会用到if语句,当n为1的时候返回1,当n大于1的时候执行res += sum(n-1)+ n利用下面这行语句即可:boolean x = n > 1 && (res = sumNums(n - 1) + n) > 0;java一定要加一个 > 0否则会报错哦class Solution { int res = 1; public int sumN

2021-02-02 15:24:52 45

原创 剑指 Offer 63. 股票的最大利润

剑指 Offer 63. 股票的最大利润思路:最大利润值就等于每个当前值减前面的最小值中最大的class Solution { public int maxProfit(int[] prices) { int min = Integer.MAX_VALUE, profit = 0; for(int i = 0; i < prices.length; i++) { if(prices[i] < min) min = prices

2021-02-02 14:46:55 53

原创 剑指 Offer 62. 圆圈中最后剩下的数字

剑指 Offer 62. 圆圈中最后剩下的数字思路:每删除一个数,那么它后面的数据就会左移m位跑到前面,这个数前面的数就会跑到后面,如图所示:红色的为要被删除的数。绿色的为最后留下来的数。可以知道:最后留下来的数的索引比为0!,我们可以从最后一轮开始递推,还原倒数第二轮的数组,倒数第二轮的数组是由倒数第一轮的数组右移m位再补全得到的。以此类推,就可以还原第一轮的数组了,也递推到了第一轮最后留下来的数的索引。class Solution { public int lastRemainin

2021-02-02 14:25:00 59

原创 剑指 Offer 61. 扑克牌中的顺子

剑指 Offer 61. 扑克牌中的顺子思路:除0以外的最大值减最小值小于数组长度(说明数组中的数都在最大值与最小值之间),可能为12345,或者12225,结果都为fasle,而10005结果为true,说明只要数组中没有重复元素即可。class Solution { public boolean isStraight(int[] nums) { HashSet<Integer> set = new HashSet<Integer>();

2021-02-01 16:03:16 50

原创 剑指 Offer 60.n个骰子的点数

剑指 Offer 60.n个骰子的点数思路:n个骰子的点数之和为s等于前n-1骰子之和(s - 最后一个骰子的点数)加上最后一个骰子的点数(1~6)。设dp[i][j]为i个骰子点数之和为j的概率,转移方程为dp[i][j] = dp[i - 1][j - k] * dp[1][k],i的范围为1~n,j的范围为i ~ 6 * i,k的范围为1 ~ 6.结果列表的大小为6 * n - n + 1 = 5 * n + 1.时间复杂度为O(n^2)空间复杂度为O(n^2)class Solution

2021-02-01 14:41:10 66

原创 剑指 Offer 59 - II. 队列的最大值

剑指 Offer 59 - II. 队列的最大值思路:这题和滑动窗口的最大值一样,用一个双端队列来维护当前最大值。唯一不同的地方是滑动窗口那题每加入一个新元素就要去除一个旧元素,而这题只有调用pop函数时才去除,其余比较方法都一模一样。class MaxQueue { Queue<Integer> queque; Deque<Integer> deque; public MaxQueue() { queque = new LinkedLis

2021-02-01 12:28:01 63

原创 剑指 Offer 59 - I.滑动窗口的最大值

剑指 Offer 59 - I.滑动窗口的最大值思路:最先想到的方法就是每k个遍历一次,但是这样太浪费时间了。只要第一次遍历k个,获得第一个滑动窗口里的最大值,放在双端队列的队头,在最大值出现之前的比它小的数都不用考虑了,因为它们会比最大值先滑出去。所以当滑动窗口向右移动时,要先判断队头是不是下一个要被滑出去的数,如果是就把它出队,再把比即将加进来的数小的数全部出队(也是一个道理),重复此步骤,直到最后一个数加入队列。在形成第一个滑动窗口以后,每加入一个数都形成下一个滑动窗口,每形成一个滑动窗口,结果列

2021-01-31 21:54:48 45

原创 剑指 Offer 57 - II. 和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列利用求和公式和滑动窗口:求和公式:滑动窗口:时间复杂度O(N)空间复杂度O(1)class Solution { public int[][] findContinuousSequence(int target) { int i = 1, j = 2; List<int[]> res = new ArrayList(); while(i < j) {

2021-01-29 16:15:22 42

原创 剑指 Offer 56 - I.数组中数字出现的次数

剑指 Offer 56 - I.数组中数字出现的次数分组异或! 细节都写在注释里了时间复杂度O(N)空间复杂度O(1)class Solution { public int[] singleNumbers(int[] nums) { int xor = 0; for(int num : nums) xor ^= num; //获取两个数中不一样的位 int mask = 1; while((xor & mask) ==

2021-01-28 20:42:52 232

原创 剑指 Offer 56 - II.数组中数字出现的次数II

剑指 Offer 56 - II.数组中数字出现的次数II描述一下大佬的思路:将所有数的二进制值按位加起来再按位除以3取余,最后会得到只出现一次的数的二进制表示。再通过移位和或运算将二进制恢复成10进制即可。class Solution { public int singleNumber(int[] nums) { int[] count = new int[32]; for(int i = 0; i < nums.length; i++) {

2021-01-28 19:34:25 57

原创 剑指 Offer 55 - II.平衡二叉树

剑指 Offer 55 - II.平衡二叉树思路:一颗平衡二叉树,它的左右子树也都是平衡二叉树,且左右子树深度差不超过1。我写了三个函数,isBalanced(当本身及其左右子树都为平衡二叉树时返回true)、recur(当左右子树深度差不超过1时返回true)、depth(计算树的深度,上一题做过了!刚开始没想到,看了题解才知道这样)class Solution { public boolean isBalanced(TreeNode root) { if(root == nul

2021-01-28 14:38:12 154

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除