算法小白
作为一个前端小白,算法更白。还是老老实实去学学才好。
小R.
总之岁月漫长,然而值得期待
展开
-
找出最长连续递增子序列(部分有序)
题目: 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,{1,9,2,5,7,3,4,6,8,0} 中最长的递增子序列为 {3,4,6,8} 。分析: 下面是我以前在网上搜的一种写法,挺好理解的。令递增子序列长度 k 为1,如果是递增的,就让k++,反之说明不再是递增的,就让k回到初始的1,为了记住这一段递增序列的长度和开头位置,引入了maxLen 和 begin ,用 maxLen 保存该长度,用 begin 保存开头位置,如果下一个递增子序列的长度>maxLe原创 2020-09-29 09:16:53 · 1251 阅读 · 1 评论 -
蓝桥杯__基础练习3__字母图形__java,两种解法
题目:法一: 分析: 我们假设A = 0,B = 1,C = 2,……这时,5行7列的图形就变成了: 0123456 1012345 2101234 3210123 4321012 找规律,我们发现,某位置的数字 = 该数字所在行 与 所在列 的差值的绝对 值。例如:第二行第一列 1 就= 2-1 = 1。 代码实现:import java.util.Scanner;public class _03_字母图形_1 { publi原创 2020-09-28 22:39:10 · 165 阅读 · 1 评论 -
在有空字符串的有序字符串数组中查找
题目: 有一个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引。分析: 这道题也是用二分查找,注意在选取mid时,如果为空字符串,mid++即可。代码实现:public class _07在有空字符串的有序字符串数组中查找 { public static void main(String[] args) { String[]arr = {"a","","ac","","ad","b","","ba"}; int res = index原创 2020-09-28 17:44:59 · 204 阅读 · 0 评论 -
旋转数组的最小数字_改造二分法
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为1。分析: 显然这道题如果我们从头到尾遍历一次,就能找到最小的元素,时间复杂度为O(n)。 如果我们用二分法,可以将该数组分为两个数组,如果数组第一个数小于数组中间那个数,说明被分成的第一个数组仍是递增的,这时我们可以从原数组中间那个数作为开头,重复上述操作,直到中间那个数小原创 2020-09-28 16:36:31 · 116 阅读 · 0 评论 -
递归(6):小白上楼梯
题目: 小白正在上楼梯,楼梯有 n 阶台阶,小白一次可以上1阶,2阶或者3阶。实现一个方法,计算小白有多少种走完楼梯的方式。代码实现:import java.util.Scanner;public class _05小白上楼梯 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int res = f(n); System.o原创 2020-09-04 17:04:39 · 108 阅读 · 0 评论 -
排序算法的稳定性
稳定:如果a原本在b的前面,而a=b,排序后a仍在b的前面。不稳定性:如果a原本在b的前面,而a=b,排序后a可能在b的后面。插入排序:稳定希尔排序:不稳定选择排序:不稳定堆排序:不稳定冒泡排序:稳定快速排序:不稳定归并排序:稳定百度了相关内容,看到几个不错的博客:八大排序算法的稳定性及时间复杂度排序算法的稳定性及其意义常见排序算法的总结 - 复杂度、实现和稳定性...原创 2020-09-04 15:56:51 · 81 阅读 · 0 评论 -
希尔排序
介绍: 希尔排序是插入排序的一种。 也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。 希尔排序是非稳定排序算法。思路:如序列 9 8 7 6 5 4 3 2 1确定一个增量序列,如4(length/2)2 1,从大到小使用增量。使用第一个增量,将序列划分为若干个子序列,下标组合为0-4-8,1-5,2-6,3-7依次对子序列使用直接插入排序法;使用第二个增量,将序列划分为若干个子序列(0-2-4-6-8),(1-3-5-7);依次对子序列使用直接插入排序法;使用第三原创 2020-08-29 16:23:26 · 84 阅读 · 0 评论 -
递归(5)—— 二分查找的递归解法
分析: 全范围内二分查找 等价于三个子问题: 左边找(递归) 中间找 右边找(递归) 注意:左边找和右边找只选其一。代码实现:public class _15二分查找的递归解法 { public static void main(String[] args) { int arr[] = {1,2,3,4,5}; System.out.println(binarySearch(arr,0,4,4)); } //arr:传入的数组 //low、h原创 2020-08-29 15:08:43 · 153 阅读 · 0 评论 -
递归(4)—— 汉诺塔
分析: 初始的N个从小到大的盘子,N是最大编号。 1-N从A移动到B,C作为辅助。 等价于: 1、1-N-1从A移动到C,B作为辅助。 2、把N从A移动到B。 3、1-N-1从C移动到B,A作为辅助。代码实现:public class _14汉诺塔 { public static void main(String[] args) { printHanoiTower(3,"A","B","C"); } static void pr原创 2020-08-29 14:48:18 · 203 阅读 · 1 评论 -
递归(3)—— 递归形式进行插入排序
分析: 对数组的0-倒数第一个排序等价于: 对数组的0-倒数第二个元素,这部分排序 然后把最后一个元素插入到这个有序的部分中。代码:public class _13递归形式进行插入排序 { public static void main(String[] args) { int arr[] = {1, 2, 4, 3, 4, 3, 5, 2, 5}; insertSort(arr, 8); for (int i = 0; i < arr.length; i++) {原创 2020-08-29 12:10:44 · 417 阅读 · 0 评论 -
递归(2)—— 斐波那契数列、最大公约数
一、斐波那契数列介绍 斐波那契数列,又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……这个数列从第3项开始,每一项都等于前两项之和。代码实现public class _11斐波那契数列 { public static void main(String[] args) { System.out.println(fib(6)); } static int fib(int n) {原创 2020-08-29 10:04:01 · 318 阅读 · 0 评论 -
递归(1)—— 求阶乘 打印 i 到 j 对数组求和 翻转字符串
一、求阶乘分析代码实现public class _02求阶乘 { public static void main(String[] args) { int res = f(5); System.out.println(res); } //f(n)求n的阶乘,f(n-1)求n-1的阶乘 static int f(int n) { if(n == 1) return 1; return n * f(n-1); }}运行结果二、打印 i 到 j代码实现pu原创 2020-08-14 13:08:14 · 205 阅读 · 0 评论 -
位运算(8)—— 出现k次与出现1次
题目 数组中只有一个数出现了一次,其他的数都出现了k次,请输出只出现了1次的数。分析 例如2个二进制数10做不进位加法,结果为二进制00;10个十进制数20做不进位加法,结果为十进制0,由此可得上图规律,k个相同的k进制数做不进位加法,结果为0。故我们可以将所有的数转化成为K进制,然后做K进制的不进位加法,得出的结果再从K进制转换为10进制。代码实现public class _07出现k次与出现1次 { public static void main(String[] args) {原创 2020-08-14 11:57:24 · 296 阅读 · 0 评论 -
位运算(7)—— 0~1之间浮点实数的二进制表示
题目 给定一个介于0和1之间的实数,(如0.625),类型为double,打印它的二进制表示(0.101,因为小数点后的二进制分别表示0.5,0.25,0.125……)如果该数字无法精确的用32位以内的二进制表示,则打印“ERROR”。分析 这里用到的是小数化为二进制数,×2取整。代码实现public class _06是0到1间浮点实数的二进制表示 { public static void main(String[] args) { double num = 0.625; St原创 2020-08-13 16:17:08 · 402 阅读 · 0 评论 -
位运算(6)—— 将整数的奇偶位互换
题目 将整数的奇偶位互换。分析代码实现public class _05将整数的奇偶位互换 { public static void main(String[] args) { int a = 6; int b = m(a); System.out.println(b); } private static int m(int i) { //1010 换成16进制是a int ou = i & 0xaaaaaaaa;//和 1010 1010 1010……做原创 2020-08-13 15:34:52 · 212 阅读 · 0 评论 -
位运算(5)——用一条语句判断一个整数是不是2的整数次方
题目 用一条语句判断一个整数是不是2的整数次方。分析 如果一个整数是2的整数次方,那它的二进制表示中有且只有一个1,其余为0。例如 8 —— 1000,16 —— 10000等等。反之如果不是2的整数次方,它的二进制表示中可有多个1,例如 9 —— 1001。 若将该整数减去1再与自己进行与运算,如 0111 ^ 1000 = 0,仅有的1也变为了0。根据这个规律,我们可以解答该题。代码实现import java.util.Scanner;public class _04是不是2的整原创 2020-08-13 15:13:21 · 388 阅读 · 0 评论 -
位运算(4)——二进制中1的个数
题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。 例如:9的二进制表示为 1001,有2位是1分析 假设该二进制数为N,该题有三种解法,可逐位判断,也可利用 (N-1) & N。代码实现import java.util.Scanner;public class _03二进制中1的个数 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); i原创 2020-08-13 14:29:57 · 256 阅读 · 0 评论 -
位运算(3)——只出现一次的数字
题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例输入: [2,2,1]输出: 1输入: [4,1,2,1,2]输出: 4分析 根据 a ^ a = 0,0 ^ b = b 即可消除重复元素,得到落单元素。代码实现public class _02只出现一次的数字 { public static void main(String[] args) { // 这里用1-5数举例,数组长度为9 i原创 2020-08-13 12:21:10 · 179 阅读 · 0 评论 -
位运算(2)——找出唯一成对的数
问题 1—1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来。不用辅助存储空间,能否设计一个算法实现?分析 在位运算中,A ^ A = 0; B ^ 0 = B,我们可以让1—1000这1000个数异或后的值跟数组中的1001个元素异或,即(1 ^ 2 ^ … ^ 1000)^(1 ^ 2 ^ … ^ 1000 ^ 重复数k),即(1 ^ 1) ^ (2 ^ 2) ^ … ^ (1000 ^ 10原创 2020-08-13 11:51:22 · 204 阅读 · 0 评论 -
位运算(1)——初识位运算
前段时间数电课学了些进制转换,还有与或非等逻辑运算,如今再来看看位运算,倒轻松了不少。 很早就想写些非总结性博客了,奈何还是太懒。也也不知怎的突然又来了兴致,赶忙写下这篇博客。 废话不多说,今天准备总结总结关于位运算的知识。什么是位运算 程序中的所有数在计算机内存中都是以二进制的形式存储的,即0、1两种状态,而位运算就是直接对整数在内存中的二进制位进行操作。进制转换十进制转...原创 2020-03-18 13:04:26 · 257 阅读 · 0 评论