自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 unmodifiableList的理解与用法

按照字面意思,unmodifiableList的意思就是不可以修改的,是一个只读的集合,所以对这个List,不能进行添加或删除元素的操作;因为也是第一次见到这个Collections.unmodifiableList方法,所以学习记录一下;参考了Leaf_wuji的博客如下代码,定义了一个Customer类,在对Customer类实例化后,需要对其中的phone属性进行写操作,代码运行正常:import java.util.ArrayList;import java.util.Collection

2021-12-23 00:07:00 4850 1

原创 异或运算加密字符串(java)

要求:将输入的一串字符的每个字符ASCII码和0xFF做异或运算,然后输出; 再编程将异或加密的字符串还原为原文。对于一些字符串,如果不想信息泄露的话,比较常用的一种方法就是对原字符串进行异或运算,再输出转换后的字符串,以达到一个加密效果。加密思路:①首先将字符串中的每个字符都转换成对应的ASCII码值。②把ASCII码值的十进制转成对应的二进制数。③用一个新的字符与原字符串的每一个字符作二进制的异或运算。④再将加密之后的二进制转换为对应的十进制。⑤把每一个十进制数转化成对应的字符再输出。代

2021-01-14 09:44:31 3050 1

原创 java批量修改文件名

当需要重命名一些文件的时候,一个个修改,那可能得累的砸键盘。。。当需要批量处理文件名的时候,直接一个java程序就简单明了~~例如需要将文件的后缀名全部都改为 png 格式import java.io.File;public class RenameFile { public static void main(String[] args) { File f = new File("E:/fish/"); //给定要查找的路径 if (f.exists())

2021-01-03 22:40:57 443

原创 leetcode-20-有效的括号(java)

题目描述:这个题目就是经典的括号匹配问题,括号匹配需要考虑的因素比较多,所以需要用到一个辅助栈;需要考虑的点:①如果输入的括号字符串为空,则直接匹配失败,返回false;②如果输入的括号字符串只有一个字符,也就是只有一般的括号,则也是匹配失败,返回false;③如果当前扫描到的字符为左括号,则将左括号入栈;如果扫描到的字符为右括号,则需要弹出栈顶元素,判断当前扫描到的字符与栈顶元素是否匹配,如果匹配成功,则继续往下扫描匹配;如果弹出的栈顶元素与当前扫描到的字符不匹配,则直接匹配失败,返回fals

2020-11-29 23:39:07 183 1

原创 leetcode-26、27 - 删除排序数组中的重复项、移除元素(java)

题目描述:题目中需要注意的几个点:①原地修改数组,不允许使用额外的空间, 这个就需要你在比较数组中是否存在重复项的时候,需要把不重复的元素值从0开始,把数组的值往后覆盖。②如果输入的数组的长度为0或者为1,则就不存在当前元素和下一个元素进行比较的情况,所以就直接返回0或者1即可;实现代码如下:class Solution { public int removeDuplicates(int[] nums) { int p = 0; int len = 0;

2020-11-29 16:44:09 141

原创 leetcode(7-整数翻转-java)

题目描述:题目本身不难,但是中间有几个点是比较值得注意的。最一开始的思路是,先求出该整数的长度, 然后循环对10取模,然后整除10,然后求出来的每一位数,都乘上对应的几个10;原始代码如下:class Solution { public int reverse(int x) { if (x == 0) { return 0; } else { int y = x; int

2020-11-25 00:25:00 159

原创 leetcode-374-猜数字大小(java实现)

题目描述:猜数字游戏的规则如下:每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):-1:我选出的数字比你猜的数字小 pick < num1:我选出的数字比你猜的数字大 pick > num0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick =

2020-10-22 14:56:03 321 1

原创 哈夫曼树的构造与实现(java)

哈夫曼树:1、给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度WPL达到最小,就称为最优二叉树,也叫哈夫曼树;2、哈夫曼树是WPL最小的树,权值较大的节点离根节点比较近;概念说明:①路径:在一棵树中,从一个节点往下可以达到的孩子或者孙子节点之间的通路,称为路径;②路径长度:通路中分支的数目称为路径长度若规定根节点的层数为1,则从根节点到第N层节点的路径长度为 N-1③节点的权:将树中节点赋给一个某种含义的数值,组这个数值称为该节点的权;④节点的带权路径长度:从根节点到该节点

2020-10-05 20:22:15 1472 1

原创 构建大顶堆、堆排序实现(java)

堆排序介绍:①堆排序是利用堆的数据结构设计的一种排序算法,堆排序是一种选择排序,时间复杂度为O(nlogn),是不稳定排序;②堆是具有以下性质的完全二叉树:每个节点的值都大于或者等于其左右孩子节点的值,称为大顶堆;(没有要求其左右孩子节点的值谁大谁小)③每个节点的值都小于或者等于其左右孩子节点的值,称为小顶堆对堆中的节点按层进行编号,映射到数组中:大顶堆的特点:arr[i] >= arr[2 * i + 1] && arr[i] >= arr[2 * i + 2]

2020-10-05 17:08:51 1061

原创 顺序存储二叉树(java)

顺序存储二叉树的概念:以数据存储来卡你,数组存储方式和树的存储方式是可以相互转换的,即数组可以转换为树,树也可以转换为数组;那么在对于顺序存储二叉树,我们就可以利用数组的顺序存储的特点,用数组来实现二叉树的顺序存储;如下图所示:顺序存储二叉树的特点:1、顺序二叉树通常只考虑完全二叉树2、第n个节点的左子节点为 2 * n + 13、第n个元素的右子节点为 2 * n + 24、第n个元素的父节点为 (n - 1) / 25、n:表示二叉树中的第几个元素(按0开始编号)例子: 给定一个数组

2020-10-04 17:47:56 518

原创 斐波那契(黄金分割法)查找算法(java)

斐波那契(黄金分割法)原理:斐波那契查找算法,也同样还是要求待查找序列是有序的斐波那契查找原理和二分查找、插值查找的原理大致相同,仅仅是改变了中间节点(mid)的位置,mid不再是中间或者插值得到,而是位于黄金分割点附近,即mid = low + F(k - 1) - 1 //其中F代表的是斐波那契数列 对 F(k - 1) - 1的理解:1、由斐波那契数列 F[k] = F[k - 1] + F[k - 2]的性质,可以得到 (F[k] - 1) = (F[k - 1] - 1) + (F[

2020-10-02 21:45:46 486

原创 插值查找实现(java)

插值查找原理:插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找将折半查找中的求mid索引的公式,low表示左边索引 left , high表示右边索引 right, key就是待查找的值 valueint mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]); //插值索引 例如:对于有序序列 {1,2,…,100},查找数值 1 :①如果使用二分查找int mid

2020-09-29 22:48:26 157

原创 二分查找实现(java)

二分查找的思路二分查找只适用于有序的序列1、首先要确定该数组的中间的下标, mid = (left + right) / 22、让需要查找的数 value 和 arr[mid] 比较2.1、如果 value > arr[mid],说明要查找的数在 mid 的右边,需要递归向右查找2.2、如果 value < arr[mid],说明要查找的数在 mid 的左边,需要递归向左查找2.3、 当 value == arr[mid] 时说明找到,就返回对应的下标递归结束条件(1)如果找到,

2020-09-29 21:05:51 124

原创 基数排序实现(java)

基数排序基本思想:将所有待比较数值统一为同样的数位长度,数位较短的数前面补0,然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序的数列;基数排序就是基于桶排序,所以一共需要10个桶,分别是0~9,后面进行排序的时候,如果该数值当前比较的这个位数与桶的序号对应上,就把这个数放进对应的桶里;1、将每个元素的个位数取出,然后看这个数应该放在哪一个对应的桶中(一个一维数组)2、按照这个桶的顺序(一维数组的下标依次取出数据,放回到原来的数组)3、再对十位数进行

2020-09-29 01:31:18 143

原创 归并排序算法实现(java)

归并排序思想:归并排序是采用的一种分治思想,递归解决;如图所示,首先将序列拆分,拆成前一半和后一半,继续对子序列拆分,直到拆分为一个子序列只有一个数为止,然后再将子序列一步步合并成为一个有序序列;合并序列的代码: /** * * @param arr 需要排序的原始数组 * @param left 左边有序序列的初始索引 * @param mid 中间索引 * @param right 右边索引 * @param temp

2020-09-27 20:38:22 94

原创 快速排序实现(java)

快速排序的基本思想:选定序列中的一个元素作为枢轴,从序列的右端开始比较,如果找到比枢轴小的数,就记录此时的位置 j ,再从序列的左端开始比较,如果找到一个比枢轴大的数,就记录此时的位置 i ,并将 arr[i] 和 arr[j] 进行交换;直到左右两个索引相遇为止,则一趟排序结束;继续上述步骤,对枢轴的左边和右边再进行快速排序,也就是进行递归;枢轴的选定,可以以第一个数作为枢轴,从右往左开始比较;或者是选定中间位置的数作为枢轴,从右往左开始比较;以中间位置的数作为枢轴: public stat

2020-09-27 18:46:14 94

原创 希尔排序实现(java)

希尔排序是一种对直接插入排序的改进排序算法;其基本思想和直接插入排序大致相同;区别在于,希尔排序需要一个变量步长gap,通过步长对序列进行分组,对于每个组,组内分别进行排序,每排序一趟,步长**gap /= 2**,再依照gap进行分组,进行下一次的排序,直到步长为1,则全部排序完成;希尔排序有两种排序思路:①交换法:(按照从小到大的顺序排列),如果组内之中,前面的一个元素比后面一个元素大,就进行交换,即arr[i] > arr[i + gap],就交换,采用的是冒泡思想②移位法:如果组内之

2020-09-27 16:30:42 131

原创 八皇后问题的实现(java)

八皇后问题解决思路:①第一个皇后先放到第一行第一列②第二个皇后放到第二行第一列,判断是否满足规则,如果不满足,就继续放在第二列、第三列。。。依次把所有的列完,找到一个合适的③继续第三个皇后,还是第一列、第二列。。。知道第8个皇后也能放在一个不冲突的位置,就算是找到了一个正确解④当得到一个正确解时,在栈退回到上一个栈的时候,就回开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到;⑤然后回头继续第一个皇后放到第二列,后面继续循环执行1,2,3,4的步骤...

2020-09-23 10:38:19 372

原创 中缀表达式转后缀表达式,并计算结果(java)

后缀表达式的计算机求值过程:(== 逆波兰表达式==)从左至右扫描表达式,遇到数字时,就将数字压入栈中,遇到运算符时,就弹出栈顶的两个数字,用运算符对它们做相应的计算(次顶元素和栈顶元素),并将结果入栈;重复上述过程,直到表达式的最右端,最后运算得到的值就是表达式的结果例:(3+4)×5-6对应的后缀表达式为 3 4 + 5 × 6,针对后缀表达式求值步骤如下:①从左至右扫描,将3和4压入栈中;②遇到运算符 + ,因此弹出 4 和 3(4 为栈顶元素, 3 为次顶元素),计算 3 + 4 的值,得到

2020-09-21 15:32:23 914

原创 使用栈完成中缀表达式计算(java)

使用栈完成表达式的计算思路:先定义两个栈,一个栈存放操作数,另一个栈存放操作符号1、通过一个index值(索引),来遍历表达式2、如果index扫描到的是数字,就直接入数字栈3、如果index扫描到的是一个符号,分如下情况:3.1、如果当前的符号栈为空,就直接入栈3.2、如果符号栈中有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop中取出两个数,再从符号栈中pop中取出一个数,进行运算,将得到的结果入数栈,然后将当前的操作符入符号栈3.3、如果当前的操

2020-09-20 10:32:04 377

原创 链栈实现(java)

对于栈,有两种实现方式,一种是用数组来实现顺序栈,另外一种就是用链表的形式来实现;链栈的好处就是,不用事先规定栈的大小,不用考虑栈满的情况;链栈的定义方式大概是和单链表的定义是一样的;我的想法是,还是先定义一个头节点,在创建好了这个头节点的基础上进行出栈或者入栈的操作;另外一个就是需要一个top指针,让top一直都指向栈顶元素对于单链表而言,每次都需要从单链表的头节点开始遍历,一直到链表的最后;而栈的特点是:后进先出,也就是后面插入的元素,是先出栈的;所以用单链表来构造链栈,入栈操作,就可以使

2020-09-19 20:15:09 418

原创 约瑟夫问题实现(java)

约瑟夫问题描述:一共有n个人,从第k个人开始报数,数到m的人出列,它的下一位又从1开始报数,数到m又出列,以此类推,直到所有的人都出列为止,由此产生一个出队的序列;例如一共有5个人,编号为1,2,3,4,5从第一个人开始,每数两下就出列一个人,直到最后一个人也出列为止;①1号先开始报数,一共数了两下,到了2号,所以2号出列,序列剩下1,3,4,5;②2号出列后,从3号开始报数,数两下,到了4号,所以4号出列,序列剩下1,3,5;③4号出列后,从5号开始报数,数两下,到了1号,所以1号出列,序列剩下

2020-09-18 18:26:40 293

原创 逆序打印单链表(java)

要实现对单链表的逆序打印,可以有两种思路1、不嫌麻烦的话,可以先翻转单链表,再对翻转后的单链表进行打印,就可以得到逆序序列;(这样的问题是会破坏原来的链表的结构,这样原来的链表就没办法二次利用了)2、在不破坏单链表结构的前提下,要实现对单链表的翻转,可以使用单链表+栈的组合实现;思路:①先遍历一遍单链表,每遍历一个节点,就把这个节点压入到栈中,直到整个单链表都遍历结束为止②对压入栈中的每个节点,依次出栈并打印,就是逆序的效果;代码实现如下://使用栈这个数据结构,将每个节点压入到栈中,然后利用

2020-09-18 17:56:26 315

原创 单链表的翻转实现(java)

单链表的翻转,意思就是在保持头节点(如果有头节点)的情况下,把节点1,2,3的顺序变成3,2,1的顺序,示意图如下:要实现单链表的翻转,就得另外需要一个新的单链表,先把节点数据翻转,存放到新的头节点后面,最后再把新的头节点赋值给原来的头节点,那么就可以把原来的头节点和翻转后的节点连接起来,从而实现单链表的翻转,示意图如下:思路:1、先定义一个新的链表2、从头到尾遍历一遍原来的链表,每遍历 一个节点,就将其取出,并放在新的链表的的最前端3、再把新的链表的头节点,赋值给原来的链表的头节点实现代码

2020-09-18 17:47:06 242

原创 查找单链表中的倒数第k个节点(java)

单链表中查找倒数第k个节点,有两种思路;①先遍历一遍整个链表,获得链表的长度,判断k值是否合法,再使用for循环,让辅助指针依次往后移,从而来找到倒数第k个节点实现代码如下: public static HeroNode findLastKNode(HeroNode head,int k) { //如果链表为空,则返回null if (head.next == null) { return null; //没有找到 }

2020-09-18 17:13:43 1167

原创 合并两个有序的单链表(递归+非递归)(java)

描述:给定两个有序的单链表,要将其合并成为一个新的有序的单链表;链表1:1,6,11链表2:5,9,15,21合并后的有序单链表顺序为:1 5 6 9 11 15 21递归分析:1、先对两个单链表进行判断,若其中一个单链表为空,那么直接返回另外一个单链表作为新的链表2、创建一个新的头节点head,先赋值为空3、比较两个单链表节点的值的大小,值小的就放在新的链表的末尾3.1、如果是链表1的节点的值更小,就把该值放在新的链表尾部,链表1指向下一位,链表2保持不变,两个参数分别是head_a.ne

2020-09-18 16:21:20 355

原创 双向链表的实现(java)

对于单链表,如果要插入某一个节点或者是删除某一个节点,需要用到一个辅助指针来找到待删除节点的前一个节点,改变它的next域的指向,从而实现删除操作;对于双向链表,好处即使,双向链表可以实现从后往前的遍历(单链表也可以实现,但是可能会稍微麻烦一点),而且双向链表在删除节点的时候,与单链表的不同之处就在于,它是直接让辅助指针指向待删除的节点,对这个节点的pre域和next域进行修改,从而实现删除操作;具体实现代码如下:(包含:遍历、在末尾添加、按顺序添加、删除操作)package com.Link;p

2020-09-18 15:07:33 145

原创 队列——顺序存储java实现

队列存储分为两种,顺序存储和链式存储,如果是使用顺序存储,一般就用到数组来进行存储,链式存储就需要用到链表;队列顺序存储——数组;实现代码如下:package com.queue;import java.util.Scanner;public class ArrayQueue { public static void main(String[] args) { //测试一下 //创建一个队列 ArrayQueue1 arrayQueue

2020-08-17 17:39:28 386

原创 五子棋存储——稀疏数组

五子棋的存储方法,大概就是用到的二维数组来存储,但是因为棋盘比较大,棋子可能比较少,直接开一个n*n的数组会比较浪费存储空间,所以利用稀疏数组来存储五子棋。实现代码如下:package sparseArray;import java.io.File;import java.io.FileOutputStream;import java.lang.reflect.Array;public class SparseArray { public static void main(Strin

2020-08-13 01:00:46 375

原创 python中如何通过字典中的值求它对应的关键字

学习python的字典的时候,遇到了一个问题,记录一下,增强记忆;python中的字典,我们可以很容易通过关键字求出它对应的value值;方法如下:例如定义了一个字典dict:dict = {'a':1,'b':2,'c':3}for i in dict : print(i)输出结果:abc如果是想输出键值对,那么可以在for循环中调用items()方法dict = {'a':1,'b':2,'c':3}for i in dict.items() : print(i)输出

2020-08-11 01:03:17 3532 1

原创 利用百度地图开源代码实现定位和实时路径跟踪

利用百度地图开源代码实现定位和实时路径跟踪这段时间需要用Android Studio做一个基于百度地图的app,记录一下过程,主要实现了定位和实时路径跟踪。先演示一下效果:(视频放不了,图片凑凑数)实时路径的思想和步骤:思想:如果需要在地图上实现实时跟踪,那么首先就需要实现定位功能,在实现了定位功能的基础上,需要在地图上画出行走轨迹,那么如何画出行走轨迹?就需要实时地记录行走的经纬度,两点之间画一条直线,中间设置定位的频率高的话,那么记录的经纬度就越多,这样就可以让记录的行走路径光滑一些。如

2020-08-10 11:47:28 4824 10

原创 python中的进制转换的几个小问题

python中可以直接调用函数来实现进制的转换,在学习过程中,我遇到了几个问题,记录一下:如果需要将当前的二进制(八进制、十六进制)等转换成对应的十进制的数,可以使用下面的方法:x=input("输入要转换的数字")print(int(x,2)) #将当前为二进制的数转换成十进制如果你当前输入的数是8进制,就把对应的2的位置,改成8就可以,这样在编译过程中,系统就会认为你是想要把这个八进制的数转换成十进制的数。如果想要把十进制的数转换成二进制,那么可以使用下面的内置函数:x=input()

2020-07-08 10:30:13 652

原创 python下载、安装、环境配置

1、右击“此电脑”,查看属性菜单项,看自己的电脑是32位还是64位,现在一般的电脑都是64位居多了。2、从python官网上下载python的安装包,网址:https://www.python.rog(这里需要注意,下载的时候,x86是指的32位机适用,x86-64为64位机适用;web-based installer是需要联网才能完成安装;executable installer是离线安装;embeddable zip file表示的是安装包为嵌入式版本,可以集成到其他应用中)3、按照自己的意愿安装

2020-06-28 00:15:39 1010

原创 中国农业大学计算机专硕——电子信息专业—考研分享(已经全部更新完毕)

先来打个草稿;目前正在准备复试,如果复试能够顺利,成功录取了的话,再来跟大家分享。

2020-04-19 22:42:51 7210 54

原创 数据库恢复时的四种转储方法

数据转储:DBA定期将数据库复制到磁盘上保存起来,能够使因某种原因而遭到破坏的数据库进行恢复为上一次备份的状态。转储方法:①静态转储:转储期间不能对数据库进行任何存取等活动,是最直接的转储方法,必须等待转储完毕后才能对数据库进行存取修改等操作;静态转储效率会比较低,转储期间,新的事务无法进行;②动态转储:转储期间允许对数据进行存取或者修改;动态转储相比静态转储的好处是转储期间,不会影响新事务...

2020-04-18 22:52:48 4342

原创 共享锁、排它锁的联系和区别

基本的封锁类型有:共享锁S,排它锁X;X锁:事务T对数据R加上了X锁时,只允许T对R进行读操作和修改操作,并且不允许其他任何事务对R进行任何的封锁操作;S锁:事务T对数据R加上额S锁时,T就只能对R进行读操作,但是不能修改,并且它不允许其他的事务对R加上X锁,但允许其他事务对R加S锁;也就是说当一个事务T对R加上了X锁之后,只能时T对R进行读写操作,其他事务均不能对R进行操作,只能等待T释...

2020-04-18 18:01:18 509

原创 关系代数中的传统集合运算、专门关系运算、关系操作

关系代数中,个人觉得比较容易搞混的有这两个概念:传统集合运算和专门关系运算;传统集合运算:并(∪)、交(∩)、差(—)、笛卡尔积(×);专门关系运算:选择(σ)、投影(Π)、连接(∞)、除(÷);传统的集合运算将关系看成元组的集合,其运算是从关系的行角度来进行;专门的关系运算不仅涉及行、还涉及列;(更高级的操作和查询)...

2020-04-18 16:21:58 9001 1

原创 关系模式中求候选码、闭包、最小依赖函数集、分解成3NF且保持函数依赖、分解成3NF且保持函数依赖和无损连接的方法

前言在准备研究生复试的过程中,数据库中的关系模式里面有几个问题比较容易混淆。一个是最小依赖函数集,一个是求候选码,一个是求闭包,一个是要把关系模式分解成3NF且保持函数依赖,一个是分解成3NF且保持函数依赖和无损连接。记录一下我对这几个问题的求法。可能会有哪里有漏洞,希望可以指出来。求闭包什么叫闭包?闭包就是由一个属性直接或者间接推出的所有属性的集合。例如:a→b,b→c;那么a的闭...

2020-04-12 21:52:41 5053 7

原创 统计数字问题(ACM题目)

问题 A: 数字统计问题(一)题目描述给定一本书,其中包含n页,计算出书的全部页码中用到了多少个数字0…9?页码从1开始输入一个整数n,代表页码总数。(1&lt;=n&lt;=106)输出十行,每行一个整数,分别表示0~9每个数字出现的次数样例输入11样例输出1411111111这里只要判断当前的数字是否是大于等于10,如果不大于10的话,那么直接可以得到用...

2019-01-02 19:52:06 438

原创 问题 A: 竞赛人选*

问题 A: 竞赛人选题目描述A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:(1)A参加时,B也参加;(2)B和C只有一个人参加;(3)C和D或者都参加,或者都不参加;(4)D和E中至少有一个人参加;(5)如果E参加,那么A和D也都参加。输入无输入输出输出参赛的人每两人之间用空格隔开占一行提示:多种情况的顺序不用考虑,直接顺序来就好。直接...

2019-01-01 16:29:46 404

空空如也

空空如也

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

TA关注的人

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