1 Star 0 Fork 31

阿明 / Ebooks

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

最新2022年数据结构与算法面试题高级面试题及附答案解析

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

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

数据结构与算法

题1:什么是数据结构?

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。

简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。

数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。

通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。

上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。

然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。

题2:有一分数序列: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

题3:Java 递归遍历目录下的所有文件?

import java.io.File;

public class ListFiles {
	public static void listAll(File directory) {
		if(!(directory.exists() && directory.isDirectory())) {
			throw new RuntimeException("目录不存在");
		}
		File[] files = directory.listFiles();
		
		for (File file : files) {
			System.out.println(file.getPath() + file.getName());
			if(file.isDirectory()) {
				listAll(file);
			}
		}
	}
	
	public static void main(String[] args) {
		File directory = new File("E:\\Program Files (x86)");
		listAll(directory);
	}
}

题4:求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

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

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

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

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

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

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

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

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

题7:什么是二叉树?

二叉树是指每个结点最多有两个子树的有序树。

通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。

二叉树常被用作二叉查找树和二叉堆。

二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。

题8:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

程序代码如下:

package com.jingxuan.system;

import java.util.Scanner;

public class JiSuan {

	private static Scanner sc;

	public static void main(String[] args) {
		sc = new Scanner(System.in);
		System.out.println("请输入一个数字:");
		double num = sc.nextDouble();
		double sum = 0;
		if (num % 2 == 0) {
			for (int i = 2; i <= num; i = i + 2) {
				sum = sum + (1.0 / i);// 因为i为整数
			}
			System.out.println("输入的偶数运算和为" + sum);
		} else {
			for (int i = 1; i <= num; i = i + 2) {
				sum = sum + (1.0 / i);
			}
			System.out.println("输入的奇数运算和为" + sum);
		}
	}
}

运行结果如下:

请输入一个数字:
6
输入的偶数运算和为0.9166666666666666

题9:在排序数组中如何查找元素的第一位和末尾位置?

假设既定一个按照升序排列的整数数组nums,和一个目标值target。找出目标值在数组中开始位置和结束位置的索引值。

如果数组中不存在目标值target,返回[-1, -1]结果值。

程序代码

import java.util.Arrays;

class Solution {
	
	public static void main(String[] args) {
		int[] nums = {6,7,8,9,9,10,12};
		System.out.println("开始位置与结束位置索引值:" + Arrays.toString(searchRange(nums, 9)));
	} 

	public static int[] searchRange(int[] nums, int target) {
		int start = binarySearch(nums, target, true);
		int end = binarySearch(nums, target, false) - 1;
		if (start <= end && end < nums.length && nums[start] == target && nums[end] == target) {
			return new int[] { start, end };
		}
		return new int[] { -1, -1 };
	}

	public static int binarySearch(int[] nums, int target, boolean lw) {
		int start = 0, end = nums.length - 1, result = nums.length;
		while (start <= end) {
			int midd = (start + end) / 2;
			if (nums[midd] > target || (lw && nums[midd] >= target)) {
				end = midd - 1;
				result = midd;
			} else {
				start = midd + 1;
			}
		}
		return result;
	}
}

输出结果

开始位置与结束位置索引值:[3, 4]

题10:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:

首先随机生成一个混乱的数组,通过判断每个数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

程序代码

import java.util.Random;

public class Demo16 {

	public static void main(String[] args) {
		int temp = 0;
		int arr[] = new int[12];
		Random r = new Random();
		for (int i = 0; i <= 10; i++)
			arr[i] = r.nextInt(1000);
		for (int i = 0; i <= 10; i++)
			System.out.print(arr[i] + "\t");
		for (int i = 0; i <= 9; i++)
			for (int k = i + 1; k <= 10; k++)
				if (arr[i] > arr[k]) {
					temp = arr[i];
					arr[i] = arr[k];
					arr[k] = temp;
				}
		System.out.println();
		for (int k = 0; k <= 10; k++)
			System.out.print(arr[k] + "\t");
		arr[11] = r.nextInt(1000);
		for (int k = 0; k <= 10; k++)
			if (arr[k] > arr[11]) {
				temp = arr[11];
				for (int j = 11; j >= k + 1; j--)
					arr[j] = arr[j - 1];
				arr[k] = temp;
			}
		System.out.println();
		for (int k = 0; k <= 11; k++)
			System.out.print(arr[k] + "\t");
	}
}

运行结果

265	882	280	873	848	283	423	549	569	494	52	
52	265	280	283	423	494	549	569	848	873	882	
52	265	280	283	423	494	549	569	701	848	873	882

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

题12:海滩上有一堆桃子五只猴子来分。第一只猴子把这堆桃子凭据分为五份多了一个这只猴子把多的一个扔入海中拿走了一份。第二只猴子把剩下-的桃子又平均分成五份又多了一个它同样把多的一个扔入海中拿走了一份第三第四第五只猴子都是这样做的问海滩上原来最少有多少个桃子

题13:如何对-10-个数从小到大进行排序

题14:判断-0-100-之间有多少个素数并输出所有素数。-

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

题16:java-中如何编写一个冒泡排序算法

题17:java-中如何编写一个希尔排序算法

题18:什么是二分法使用时注意事项

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

题20:输入某年某月某日判断这一天是这一年的第几天

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

题22:求数组中某个数字出现的次数

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

题24:求一个3*3矩阵主对角线元素之和。

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

大厂面试题

大厂面试题

大厂面试题

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

搜索帮助

53164aa7 5694891 3bd8fe86 5694891