1 Star 0 Fork 31

tankai / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
最新面试题2021年常见数据结构与算法面试题及答案汇总.md 14.05 KB
一键复制 编辑 原始数据 按行查看 历史

最新面试题2021年常见数据结构与算法面试题及答案汇总

全部面试题答案,更新日期:01月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

数据结构与算法

题1:说说几种常见的排序算法和复杂度?

1)快速排序

原理:快速排序采用的是一种分治的思想,通过依次排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

选定一个合适的值(理想情况下选择中间值最好,但实际中一般使用数组第一个值),称为“枢轴”(pivot)。

基于这个值将数组分为两部分,较小的分在左边,较大的分在右边,如此一轮下来,这个枢轴的位置一定在最终位置上。

对两个子数组分别重复上述过程,直到每个数组只有一个元素,排序完成。

复杂度:O(n)

特点:快速排序是平时最常使用的一种排序算法,因它速度快,效率高的一种排序算法。

2)冒泡排序

原理:冒泡排序采用的事两个相邻的值进行比较,将值大的交换到右侧。就是逐一比较交换,进行内外两次循环,外层循环为遍历所有数值,逐个确定每个位置,内层循环为确定位置后遍历所有后续没有确定位置的数字,与该位置的值进行比较,只要比该位置的值小,就位置交换。

复杂度:O(n^2),最佳时间复杂度为O(n)

特点:冒泡排序在实际开发中使用比较少,更适合数据量比较少的场景,因其效率比较低,但逻辑简单,方便记忆。

3)直接插入排序

原理:直接插⼊排序是从第二个数字开始,逐个取出,插入到之前排好序的数组中。

复杂度:O(n^2),最佳时间复杂度为O(n)

4)直接选择排序

原理:直接选择排序是从第一个位置开始遍历位置,找到剩余未排序的数组中最小值,将最小值做交换位置。

复杂度:O(n^2)

特点:类似冒泡排序其逻辑简单,但效率低,适合少量数据排序。

题2:什么是平衡二叉树?

平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap等。

最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

平衡二叉树是对二叉排序树的优化,防止二叉排序树在最坏情况(插入顺序恰好是有序的)下平均查找时间为n,二叉排序树在此时形如一个单链表,而平衡二叉树查找元素的次数不超过树的深度,时间复杂度为logN。

题3:二叉树基本概念是什么?

先序遍历(深度优先遍历):前、中、后这三个词是针对根节点的访问顺序而言的先访问根结点,再访问左子结点,最后访问右子结点。

中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。

后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。

层序遍历(广度优先遍历):先访问树的第一层结点,再访问树的第二层结点……一直访问到最下面一层的结点。在同一层结点中,以从左到右的顺序依次访问。

题4:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

程序分析:

利用正则表达式判断是否输入信息为数字,通过调用字符串的封装源码方法,进行逆序排序。

程序代码

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

题5:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:

利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(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

题6:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个0~9之间的数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

程序分析

关键是计算出每一项的值,然后将各个值相加得出所需的结果。

编写代码

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

题7:什么是斐波那契数列?

斐波那契数列(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……

斐波那契数列的特征:第三项开始(含第三项)它的值等于前两项之和。

题8:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

程序分析

首先判断输入内容是否为五位数数字,之后通过循环判断个位与万位相等,十位与千位相等。

程序代码

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
这是一个回文!

题9:如何实现数组中最大与第一个元素交换,最小与最后一个元素交换并输出数组?

程序代码如下:

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 

题10:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

程序分析:分子与分母的变化规律,分母等于前一个分子,分子是前一个分子加当前分母之和。关注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

题11:java-如何实现链表归并排序

题12:输入一行字符分别统计出其中英文字母空格数字和其它字符的个数。

题13:请输入星期几的第一个字母来判断一下是星期几如果第一个字母一样则继续判断第二个字母。

题14:如何取一个整数中从右端开始的4~7位的数字--

题15:有n个整数使其前面各数顺序向后移m个位置最后m个数变成最前面的m个数-

题16:java-中实现斐波那契数列有哪些方法

题17:一个整数它加上100后是一个完全平方数加上168又是一个完全平方数请问该数是多少

题18:两个乒乓球队进行比赛各出三人。甲队为a,b,c三人乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比c说他不和x,z比请编程序找出三队赛手的名单。

题19:java-中如何计算输出-9*9-口诀

题20:java-如何实现数组中整数按从小到大顺序输出-

题21:输入两个正整数m和n求其最大公约数和最小公倍数。-

题22:将一个正整数分解质因数。例如-输入90,打印出90=233*5。

题23:三个字符串如何验证其中字符串由另外两个字符串交错组成

题24:输入三个整数x,y,z请把这三个数由小到大输出。

题25:有一对兔子从出生后第3个月起每个月都生一对兔子小兔子长到第三个月后每个月又生一对兔子假如兔子都不死问每个月的兔子总数为多少

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/tankkai/ebooks.git
git@gitee.com:tankkai/ebooks.git
tankkai
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891