1 Star 0 Fork 31

moyu3390 / Ebooks_1

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

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

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

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

数据结构与算法

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

题2:什么是二叉树?

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

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

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

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

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

题3:什么是数据结构?

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

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

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

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

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

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

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

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

题4:Java 中如何编写一个希尔排序算法?

解题思路

假设一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果以步长为5开始进行排序,可以将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样(竖着的元素是步长组成):

13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后对每列进行排序:

10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

将上述四行数字,依序接在一起时得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。这时10已经移至正确位置,然后再以3为步长进行排序:

10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为:

10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序,此时就是简单的插入排序。

程序代码

Java中实现希尔排序算法代码如下:

package com.jingxuan.system;

import java.util.Arrays;

public class ShellSort {
	public static void main(String[] args) {
		int[] num = { 7, 6, 9, 3, 1, 5, 2, 4 };
		
		System.out.println("未排序的数组:" + Arrays.toString(num));
		
		// 增量序列的选择没有具体的公式,可以根据自己的数据取个合适的增量序列
		for (int increment = num.length / 2; increment > 0; increment = increment / 2) {
			// 根据增量对数组进行分组
			for (int i = increment; i < num.length; i++) {
				int index = i;
				// 进行插入排序
				// 注意:index-increment值的变化
				while ((index - increment) >= 0 && num[index] < num[index - increment]) {
					int temp = num[index];
					num[index] = num[index - increment];
					num[index - increment] = temp;
					index = index - increment;
				}
			}
		}
		System.out.println("排序后的数组:" + Arrays.toString(num));
	}
}

运行结果

未排序的数组:[7, 6, 9, 3, 1, 5, 2, 4]
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 9]

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

二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。

二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。

题6:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

程序代码

package com.jingxuan.system;

public class Sphere {
	public static void main(String[] args) {
		double s = 0;
		double t = 100;
		for (int i = 1; i <= 10; i++) {
			s += t;
			t = t / 2;
		}
		System.out.println("第10次落地时,共经过" +s+ "米");
		System.out.println("第10次反弹" +t+ "米");

	}
}

执行结果

第10次落地时,共经过199.8046875米
第10次反弹0.09765625米

题7:Java 中如何实现二分法算法?

时间复杂度

1)最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(logn)。

2)最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)。

空间复杂度

S(n)=n

分析

在有序的N个元素的数组中查找输进去的数据x值。算法如下:

1)确定查找范围front=0,end=N-1,计算中项mid=(front+end)/2。

2)若a[mid]=x或front>=end,则结束查找;否则,向下继续。

3)若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。

实例

package com.jingxuan.system;

public class BinarySearch {
	public static void main(String[] args) {
		// 二分法查找
		int[] binaryNums = { 1, 6, 15, 18, 27, 50 };
		int findValue = 27; // 查找27值
		int binaryResult = binarySearch(binaryNums, 0, binaryNums.length - 1, findValue);
		System.out.println("元素第一次出现的位置(索引从0开始):" + binaryResult);
	}

	/**
	 * 二分查找,返回该值第一次出现的位置(下标从 0 开始)
	 * 
	 * @param nums      查询数组
	 * @param start     开始下标
	 * @param end       结束下标
	 * @param findValue 要查找的值
	 * @return int
	 */
	private static int binarySearch(int[] nums, int start, int end, int findValue) {
		if (start <= end) {
			// 中间位置
			int middle = (start + end) / 2;
			// 中间的值
			int middleValue = nums[middle];
			if (findValue == middleValue) {
				// 等于中值直接返回
				return middle;
			} else if (findValue < middleValue) {
				// 小于中值,在中值之前的数据中查找
				return binarySearch(nums, start, middle - 1, findValue);
			} else {
				// 大于中值,在中值之后的数据中查找
				return binarySearch(nums, middle + 1, end, findValue);
			}
		}
		return -1;
	}
}

执行结果如下:

元素第一次出现的位置(索引从0开始):4

题8:Java 中如何将一个数组逆序输出?

程序分析:循环遍历从后往前取数组长度减1作为数的索引值,然后输出其数据。

程序代码如下:

package com.jingxuan.system;

public class ArraysReverse {
	public static void main(String[] args) {
		int[] n = { 61, 62, 21, 34, 25, 82 };
		System.out.println("数组逆序输出为");
		for (int i = n.length; i > 0; i--) {
			System.out.print(n[i-1] +  " ");
		}
	}
}

运行结果如下:

数组逆序输出为
82 25 34 21 62 61 

题9:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

程序分析:利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

程序代码如下:

package com.yoodb.util;

import java.util.Scanner;

public class Demo02 {
  private static Scanner s;

  public static void main(String[] args) {
    s = new Scanner(System.in);
    System.out.print("请输入该月的利润:(万元)");
    int I = s.nextInt();
    long sum = 0;

    if (I <= 100000) {
      sum = I / 100 * 10;
    } else if (I < 200000) {
      sum = (long) (100000 / 100 * 10 + (I - 100000) / 100 * 7.5);
    } else if (I < 400000) {
      sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + (I - 200000) / 100 * 5);
    } else if (I < 600000) {
      sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + (I - 400000) / 100 * 3);
    } else if (I < 1000000) {
      sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3
          + (I - 600000) / 100 * 1.5);
    } else {
      sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3
          + 400000 / 100 * 1.5 + (I - 1000000) / 100);
    }

    System.out.println("该月发放的奖金为:" + sum);
  }
}

运行结果如下:

请输入该月的利润:(万元)120
该月发放的奖金为:10

题10:打印出 100-999 所有的水仙花个数。

所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=1的三次方+5的三次方+3的三次方。

程序分析:

利用for循环控制100-999个数,每个数分解出个位,十位,百位。

程序代码

public class Demo02 {
	public static void main(String args[]) {
		for (int i = 100; i <= 999; i++)
			if (shuixianhua(i) == true)
				System.out.println(i + " ");
	}

	public static boolean shuixianhua(int x) {
		int i = 0, j = 0, k = 0;
		i = x / 100;
		j = (x % 100) / 10;
		k = x % 10;
		if (x == i * i * i + j * j * j + k * k * k)
			return true;
		else
			return false;
	}
}

运行结果

153 370 371 407

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

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

题13:有n个人围成一圈顺序排号。从第一个人开始报数从1到3报数凡报到3的人退出圈子问最后留下的是原来第几号的那位。

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

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

题16:java-递归遍历目录下的所有文件

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

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

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

题20:利用递归方法求-5!5的阶乘

题21:有1234个数字能组成多少个互不相同且无重复数字的三位数都是多少

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

题23:什么是链式存储结构

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

题25:什么是希尔排序

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/moyu3390/ebooks_1.git
git@gitee.com:moyu3390/ebooks_1.git
moyu3390
ebooks_1
Ebooks_1
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891