同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
1)快速排序
原理:快速排序采用的是一种分治的思想,通过依次排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
选定一个合适的值(理想情况下选择中间值最好,但实际中一般使用数组第一个值),称为“枢轴”(pivot)。
基于这个值将数组分为两部分,较小的分在左边,较大的分在右边,如此一轮下来,这个枢轴的位置一定在最终位置上。
对两个子数组分别重复上述过程,直到每个数组只有一个元素,排序完成。
复杂度:O(n)
特点:快速排序是平时最常使用的一种排序算法,因它速度快,效率高的一种排序算法。
2)冒泡排序
原理:冒泡排序采用的事两个相邻的值进行比较,将值大的交换到右侧。就是逐一比较交换,进行内外两次循环,外层循环为遍历所有数值,逐个确定每个位置,内层循环为确定位置后遍历所有后续没有确定位置的数字,与该位置的值进行比较,只要比该位置的值小,就位置交换。
复杂度:O(n^2),最佳时间复杂度为O(n)
特点:冒泡排序在实际开发中使用比较少,更适合数据量比较少的场景,因其效率比较低,但逻辑简单,方便记忆。
3)直接插入排序
原理:直接插⼊排序是从第二个数字开始,逐个取出,插入到之前排好序的数组中。
复杂度:O(n^2),最佳时间复杂度为O(n)
4)直接选择排序
原理:直接选择排序是从第一个位置开始遍历位置,找到剩余未排序的数组中最小值,将最小值做交换位置。
复杂度:O(n^2)
特点:类似冒泡排序其逻辑简单,但效率低,适合少量数据排序。
平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap等。
最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
平衡二叉树是对二叉排序树的优化,防止二叉排序树在最坏情况(插入顺序恰好是有序的)下平均查找时间为n,二叉排序树在此时形如一个单链表,而平衡二叉树查找元素的次数不超过树的深度,时间复杂度为logN。
先序遍历(深度优先遍历):前、中、后这三个词是针对根节点的访问顺序而言的先访问根结点,再访问左子结点,最后访问右子结点。
中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。
后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。
层序遍历(广度优先遍历):先访问树的第一层结点,再访问树的第二层结点……一直访问到最下面一层的结点。在同一层结点中,以从左到右的顺序依次访问。
程序分析:
利用正则表达式判断是否输入信息为数字,通过调用字符串的封装源码方法,进行逆序排序。
程序代码
import java.util.Scanner;
public class Demo10 {
private static Scanner in;
public static void main(String[] args) {
System.out.println("请输入数字:");
in = new Scanner(System.in);
String str = in.next();
if (str.matches("\\d+")) {
System.out.print("输入的是" + str.length() + "位数");
StringBuffer buf = new StringBuffer(str);
System.out.println("逆序打印:" + buf.reverse());
}
}
}
运行结果
请输入数字:
871236
输入的是6位数,逆序打印:632178
程序分析:
利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
程序代码
public class Demo09 {
public static int getAge(int n) {
if (n == 1) {
return 10;
}
return 2 + getAge(n - 1);
}
public static void main(String[] args) {
System.out.println("第五个的年龄为" + getAge(5));
}
}
运行结果
第五个的年龄为18
程序分析
关键是计算出每一项的值,然后将各个值相加得出所需的结果。
编写代码
package com.jingxuan.system;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Sumloop {
public static void main(String[] args) throws IOException {
int s = 0;
String output = "";
BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入a的值:");
String input = stadin.readLine();
for (int i = 1; i <= Integer.parseInt(input); i++) {
output += input;
int a = Integer.parseInt(output);
s += a;
System.out.println(output);
}
System.out.println("s=a+aa+aaa+aaaa+aa...a的值为:" + s);
}
}
执行结果
请输入a的值:6
6
66
666
6666
66666
666666
s=a+aa+aaa+aaaa+aa...a的值为:740736
斐波那契数列(Fibonacci Sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711…… 在数学上,斐波那契数列以如下被以递推的方法定义:
F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
斐波那契数列之所以又称黄金分割数列,是因为随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887……
斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711……
斐波那契数列的特征:第三项开始(含第三项)它的值等于前两项之和。
程序分析
首先判断输入内容是否为五位数数字,之后通过循环判断个位与万位相等,十位与千位相等。
程序代码
import java.util.Scanner;
public class Demo11 {
private static Scanner in;
public static void main(String[] args) {
System.out.println("请输入数字:");
in = new Scanner(System.in);
String str = in.next();
int l = Integer.parseInt(str);
if (l < 10000 || l > 99999) {
System.out.println("请输入正确的五位数字!");
System.exit(0);
}
boolean is = false;
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length / 2; i++) {
if (ch[i] != ch[ch.length - i - 1]) {
is = false;
} else {
is = true;
}
}
if (is) {
System.out.println("这是一个回文!");
} else {
System.out.println("不是一个回文!");
}
}
}
运行结果
请输入数字:
12321
这是一个回文!
程序代码如下:
package com.jingxuan.system;
public class ArraysZDY {
public static void main(String[] args) {
int i, min, max, temp1, temp2;
int a[] = {92,12,33,83,68,54};
max = 0;
min = 0;
for (i = 1; i < a.length; i++) {
if (a[i] > a[max])
max = i;
if (a[i] < a[min])
min = i;
}
temp1 = a[0];
temp2 = a[min];
a[0] = a[max];
a[max] = temp1;
if (min != 0) {
a[min] = a[a.length - 1];
a[a.length - 1] = temp2;
} else {
a[max] = a[a.length - 1];
a[a.length - 1] = temp1;
}
for (i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
运行结果如下:
92 54 33 83 68 12
程序分析:分子与分母的变化规律,分母等于前一个分子,分子是前一个分子加当前分母之和。关注Java精选公众号,内涵算法题100+道面试题,其他面试题3000+道题。
程序代码如下:
package com.jingxuan.system;
public class Fenshu20 {
public static void main(String[] args) {
float fm = 1f;
float fz = 1f;
float temp;
float sum = 0f;
for (int i = 0; i < 20; i++) {
temp = fm;
fm = fz;
fz = fz + temp;
sum += fz / fm;
System.out.println(fz + "/" + fm);
}
System.out.println("这个数列的前20项之和为" + sum);
}
}
运行结果如下:
2.0/1.0
3.0/2.0
5.0/3.0
8.0/5.0
13.0/8.0
21.0/13.0
34.0/21.0
55.0/34.0
89.0/55.0
144.0/89.0
233.0/144.0
377.0/233.0
610.0/377.0
987.0/610.0
1597.0/987.0
2584.0/1597.0
4181.0/2584.0
6765.0/4181.0
10946.0/6765.0
17711.0/10946.0
这个数列的前20项之和为32.660263
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。