- 博客(29)
- 收藏
- 关注
原创 如何判断链表有环
如何判断链表有环呢有很多种算法,而时间空间最优的算法是双指针算法,创建两个指针,开始大循环,指针p每次移动一个节点,指针p2每次移动两个节点,比较两个节点是否相同,因为如果有环的话,快的早晚你会追上慢的。接下来是代码public static boolean isCycle(Node head) { Node p1 = head; Node p2 = head; while (p2!=null && p2.next!=null){...
2022-06-04 03:30:00
251
原创 冒泡排序的优化和鸡尾酒排序
冒泡排序的优化及鸡尾酒排序首先,我们已经知道了最基本的冒泡排序,可是会有一个问题,就是当排序到一定位置的时候,数组已经有序,可是还是会进行循环,我们该怎么办这个实现很简单,就是加一个标记,如果已经有序就不用比较了 public static void sort(int[]arrays){ for (int i=0;i<arrays.length-1;i++){ boolean sorts=true;//有序标记,每一轮的初始是true ...
2022-06-04 03:00:00
149
原创 JAVA快速排序递归算法
快速排序分为双边循环法和单边循环法,先来双边循环法,双边循环法是使用双指针,首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。轮到left指针行动,让指针所指向的元素和基准元素做比较。如果小于或等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。然后
2022-06-04 03:00:00
1446
原创 JAVA堆排序
堆排序,堆排序基于二叉堆,可以看我这篇首先创立一个最大二叉堆,从二叉堆可知,每次我们从顶部删除一个元素,第二大元素就会上浮上来,经过有限次循环,就会从小到大排序,而元素不一定·真的删除,只需要将其放置尾部即可。看代码public class Heapsort {/** * 下沉调整 * @param array 待调整的堆 * @param parentIndex 要下沉的父节点 * @param length 堆的有效大小 */public static vo.
2022-06-04 03:00:00
206
原创 JAVA快速排序栈实现(非递归)
快速排序非递归方法,使用栈实现的,入栈和出栈相当于递归操作public static void quickSort(int[] arr, int startIndex, int endIndex) { // 用一个集合栈来代替递归的函数栈 Stack<Map<String, Integer>> quickSortStack = new Stack<Map<String, Integer>>(); // 整个
2022-05-29 19:52:38
535
原创 JAVA二叉堆优先队列
二叉堆实现优先队列,我们写一下最大优先队列最大优先队列 ,无论入队顺序如何,都是当前最大的元素优先出队,分为入队操作和出队操作。这是入队操作,如果数组长度不够我们会进行扩容操作。public void enQueue(int key) { //队列长度超出范围,扩容 if(size >= array.length){ resize(); } array[size++] = key; upA...
2022-05-28 20:17:23
143
原创 Java二叉堆的自我调整与排序
二叉堆的定义就不多说了,我们主要介绍二叉堆的自我调整,二叉堆分为最大堆,最小堆。二叉堆的储存方式是数组,所以其左子下标为 2*parent+1;右子为2*parent+2;搞明白了这个,首先介绍插入一个数,插入位置是二叉堆最后一个位置;将其排序,则 我们使用上浮调整最小堆public static void upAdjust(int[] array) { int childIndex = array.length-1;//最后一个子值的下标 int parentI
2022-05-28 18:34:16
138
原创 JAVA广度优先遍历(层序遍历)
广度优先和深度优先不同,广度优先是以一层一层往下走的,直到各个方向走完我们看看层序遍历 用的是queue队列,先进先出原则用图解释一下:理解的差不多了吧,我们用代码解释一下这里我们使用offer替代add,用poll替代pop,因为offer和poll遇到错误会输出false而那两种会抛出IllegalStateException异常。public static void levelOrderTraversal(TreeNode root){ Queue&
2022-05-28 17:24:22
817
原创 Java二叉树非递归遍历
这里我们用栈的方法遍历树,如果想看递归,和创建树的,见这个博文二叉树的创建和深度优先递归_写代码别头秃的博客-优快云博客非递归我们用stack栈的原则,为先进后出public static void preOrderTraveralWithStack(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode treeNode = roo
2022-05-28 16:48:05
248
1
原创 二叉树的创建和深度优先递归
二叉树的深度遍历分为前中后遍历,关于前中后遍历的概念,别的博客有讲,我们主要研究一下二叉树的创建原理和遍历的代码首先我们创建树的节点: private static class TreeNode { int data; TreeNode leftChild; TreeNode rightChild; TreeNode(int data) { this.data = dat
2022-05-28 13:23:15
178
原创 JAVA循环队列
首先我们了解什么是队列队列就像下面那个表格一样是一个格子一个格子的,里面就是数据1 2 3 4 5 6 7 9 循环队列是长度一定的情况下,队头和队尾在队列中循环,队头指的不是物理上的,而是一个指针,队列遵循先进先出的原则,每次取数据是从队头取,队头指针则会向下指,例如4 5 6 1 2 3 此时5就是队头而4就是队尾,这里有一个很重要的数学公式,由于队列长度一定,则你想要.
2022-05-25 17:19:44
2090
1
原创 JAVA链表的使用
废话不多说,直接看代码,注释应该说的很明白了public class MyLinkedList { //头节点指针 private Node head; //尾节点指针 private Node last; //链表实际长度 private int size; /** * 链表插入元素 * @param index 插入位置 * @param data 插入元素 */ public void i
2022-05-25 16:48:24
272
原创 验证歌德巴赫猜想
【题目描述】哥德巴赫猜想:一个大于2的偶数是两个素数的和。编写程序验证哥德巴赫猜想,输入一个大于2但是小于等于500的偶数,如果它能表示成为2个素数的和,则输出所有的可能情况(输出格式为 大素数+小素数=偶数).【输入格式】一行一个符合数据范围的偶数【输出格式】若干行表示所有表示的可能情况(注意空格分隔)【输入样例】24【输出样例】19 + 5 =2417 + 7 =2413 + 11 =24//歌德巴赫猜想 #include<iostream&
2022-05-12 22:34:23
1226
1
原创 汉诺塔问题
【题目描述】有三座塔A,B,C,开始时A上有n个盘子,盘子大小不等,大在下小在上。要将盘子从A座移到C座,每次只能移一个,并且在移动的过程中始终保持大在下小在上。输入盘子的数量n,输出移动的步骤。(提示:利用递归完成)【输入格式】一行一个整数 n【输出格式】输出若干行表示每次移动的步骤【样例输入】 2【样例输出】 A to B A to C B to C #include<iostream>using namespace s...
2022-05-12 22:32:51
331
原创 走格子(递归)
【题目描述】现有一个 m*n 的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子?【输入格式】一行两个整数表示 m,n【输出格式】一行一个整数表示答案【输入样例】2 2【输出样例】2#include<iostream>using namespace std;long int fun(int x) { if (x == 1) return 1; else return x * fun(x - 1)
2022-05-12 22:30:48
893
原创 求1到n的立方和
【题目描述】编写程序求1*1*1 + 2*2*2 + 3*3*3 + ... + n*n*n的结果,要求用递归函数来完成。说明:该公式的结果可保存在int型变量中,无需考虑超出int保存范围的情况。 【输入格式】一行一个整数 n【输出格式】一行一个整数表示答案【输入样例】 3【输出样例】 36 #include <iostream> using namespace std; int a, b, c, d, i; ...
2022-05-12 22:29:26
1783
原创 数字反射(cg)
【题目描述】编写一个函数,接收一个整数值,返回这个数中数字逆序后的结果值。【输入格式】一行一个整数【输出格式】一行一个整数表示结果【输入样例】7631【输出样例】1367思路1、 通过% 10运算与循环的结合,可依次获得给定数的每位数字。例如:7631%10=1,获得了个位数;7631 / 10 =763,即丢掉了个位数字。继续下去,可依次得到数字1、3、6、7.2、 边循环边将每次得到的数字添加到需返回的数值中。例如:0*10+1=1;1*10+3..
2022-05-12 22:27:31
417
1
原创 将十进制转换二进制
【题目描述】输入1个正整数n(n>0),将其转换为二进制后输出。【输入格式】一行一个正整数 n【输出格式】一行一个二进制数表示结果【样例输入】 15【样例输出】 1111 #include<iostream> using namespace std; void change(int n) { if (n > 1) change(n / 2); cout << n % 2; }...
2022-05-12 22:24:44
422
原创 递归求斐波那契数列的第n项。
【题目描述】利用递归求斐波那契数列的第n项。斐波那契数列规律: 0,1,1,2,3,5,8,13……【输入格式】一行一个整数 n【输出格式】一行一个整数表示斐波那契额数列的第 n 项。【输入样例】 7【输出样例】 8 #include <iostream> using namespace std; int geigei(int n){ if (n==0||n==1) return n; else return geigei(...
2022-05-12 22:22:19
1784
1
原创 分段函数(cg)
【问题描述】有一个定义在自然数上的函数 f(x) 定义如下: 若 x<5 , 则 f(x) = x; 若 5<=x<15, 则 f(x) = x+6; 若 x>=15, 则 f(x) = x-6。 试编写该函数,输入x值,返回相应的f(x)值。【输入形式】 一行一个数表示自然数x。【输出形式】 一行表示计算结果f(x),若输入的数据不合法(如:负整数)...
2022-05-12 22:20:23
1953
原创 java的IO流小结
字节流分为:输入流(inputstream),输出流(outputstream)。可以复制任意的文件数据,一般采用字节缓冲流一次读写一个字节数组的方式输入流:两种读取方式1.int read()一次读取一个字节2.int read(byte[]bys)一次一个字节数组输出流:两种写数据方式1.void write(int by)一次写一个字节2.void write(byte[]bys,int dex,int len)...
2022-05-12 12:17:28
249
原创 求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值
#include <iostream>using namespace std;int main(){ int n; cin >> n; int s=0; int a=1,b=0; for( ;a<=n;++a){ b+=a; s+=b; } cout << "s=1+(1+2)+(1+2+3)+…+(1+2+3+…+"<<n<<")=" .
2022-05-11 20:10:28
1300
原创 猴子分桃子
#include<iostream>using namespace std;int main(){ double k=1,w,z,y,x; w=(5*k+1)/4; z=(5*w+1)/4; y=(5*z+1)/4; x=(5*y+1)/4; for(;((k!=(int)k)||(w!=(int)w)||(z!=(int)z)||(y!=(int)y)||(x!=(int)x));){ w=(5*k+1)/4; z=(5*w+1)/4; y=(5*z+1)/4;.
2022-05-11 20:09:24
123
原创 18岁生日
#include<iostream>using namespace std;int main(){ int x,y,z,h,day; cin>>x>>y>>z; if(y==2&&z==29){ cout<<-1; }else{ h=x%4; if(y>2){ if(h==0||h==1){ day=365*18+4; cout<<day; }else{ .
2022-05-11 20:07:45
270
原创 求出1~1 000之间的所有完全数
#include <iostream>using namespace std;int main(){ int sum; for(int i=2;i<=1000;i++) { for(int j=1;j<i;j++) { if(i%j==0) sum+=j; } if(sum==i) cout<<i<<" "; sum=0; } }
2022-05-11 20:06:35
146
原创 计算无重复的三位偶数的个数
#include<iostream>using namespace std;int main(){ int m,n,h; cin>>m; if(m<2){ return 0; }else{ if(m%2==1){ n=m+1; h=(n-2)*(n-1)+((n/2)-1)*(n-2)*(n-2); cout<<h; }else{ n=m+1; h=(n-2)*(n-2)*((n+1)/2-1)+(...
2022-05-11 20:05:24
329
原创 两个复数的四则运算
【题目描述】完成下面程序,实现两个复数的四则运算。r1为第一个操作数的实部,i1为第一个操作数的虚部,op为操作符,r2为第二个操作数的实部,i2为第二个操作数的虚部。输出两个复数的运算结果。如果op为'+' '-' '*' '/'以外的字符,输出:"error"。op为'/',且r2,i2均为0时,输出:"Divisor cannot be 0"。(不带引号)【输入格式】一行,先是两个数表示第一个复数的实部和虚部,之后是一个字符表示操作符,最后再有两个数表示第二个复数的实部和虚..
2022-05-11 19:57:35
429
原创 求s=4+6+8阶乘
#include <iostream> using namespace std; int x(int a);int main() { static int s = 0; cout <<"s=4!+6!+8!=" << x(4) + x(6) + x(8) << endl;}int x(int a=4) { if (a == 0) return 1; else return a * x(a - 1);}
2022-05-11 19:52:53
119
原创 判断输入的是英文字母还数字
【题目描述】从键盘输入一个字符,判断是数字还是英文字母【输入格式】一行一个字符【输出格式】如果是数字,输出 "digit";如果是英文字母,输出 "char" ,否则输出 "other" (均不带引号)【输入样例1】5【输出样例1】digit【输入样例2】d【输出样例2】char【输入样例3】[【输出样例3】other#include<iostream>using namespace std;int main(){
2022-05-11 19:50:23
1553
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人