1 Star 0 Fork 31

霍月龙 / Ebooks

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

2022年最全数据结构与算法面试题附答案解析大汇总

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

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

数据结构与算法

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

程序分析:

质数(prime number)又称素数,有无限个。

质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

程序代码

public class Demo13 {
    public static void main(String args[]) {
        int sum, i;
        for (sum = 2; sum <= 100; sum++) {
            for (i = 2; i <= sum / 2; i++) {
                if (sum % i == 0)
                    break;
            }
            if (i > sum / 2)
                System.out.print(sum + " ");
        }
        System.out.println("都是素数");
    }
}

public class Demo131 {
	public static void main(String args[]) {
		int w = 1;
		for (int i = 2; i <= 100; i++) {
			for (int j = 2; j < i; j++) {
				w = i % j;
				if (w == 0)
					break;
			}
			if (w != 0)
				System.out.print(i + " ");
		}
		System.out.println("都是素数");
	}
}

运行结果

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 都是素数

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

程序分析:

根据不同队员进行对比,如果不符合条件,遍历另一队员进行判断。

程序代码

public class Demo07 {
    static char[] m = { 'a', 'b', 'c' }; 
    static char[] n = { 'x', 'y', 'z' };
    public static void main(String[] args) {
        for (int i = 0; i < m.length; i++) { 
            for (int j = 0; j < n.length; j++) {
                if (m[i] == 'a' && n[j] == 'x') {
                    continue;
                } else if (m[i] == 'a' && n[j] == 'y') {
                    continue;
                } else if ((m[i] == 'c' && n[j] == 'x')
                        || (m[i] == 'c' && n[j] == 'z')) {
                    continue;
                } else if ((m[i] == 'b' && n[j] == 'z')
                        || (m[i] == 'b' && n[j] == 'y')) {
                    continue;
                } else
                    System.out.println(m[i] + " vs " + n[j]);
            }
        }
    }
}

public class Demo071 {
    public String a, b, c;
    public Demo071(String a, String b, String c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static void main(String[] args) {
    	Demo071 arr_a = new Demo071("a", "b", "c");
        String[] b = { "x", "y", "z" };
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                	Demo071 arr_b = new Demo071(b[i], b[j], b[k]);
                    if (!arr_b.a.equals(arr_b.b) & !arr_b.b.equals(arr_b.c)
                            & !arr_b.c.equals(arr_b.a) & !arr_b.a.equals("x")
                            & !arr_b.c.equals("x") & !arr_b.c.equals("z")) {
                        System.out.println(arr_a.a + " vs " + arr_b.a);
                        System.out.println(arr_a.b + " vs " + arr_b.b);
                        System.out.println(arr_a.c + " vs " + arr_b.c);
                    }
                }
            }
        }
    }
}

运行结果

a vs z
b vs x
c vs y

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

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

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

题4:打印出如下图案(菱形)?

程序分析:

先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

	*
  ***
 *****
*******
 *****
  ***
   *

程序代码

public class Demo08 {
    public static void main (String[]args){
        int lay = 7;
        for(int m = 1; m <=(lay+1)/2; m++){
            for(int b = 1; b <=(lay+1)/2-m ; b++)
                System.out.print(" ");
            for(int c = 1; c <= m*2-1; c++)
                System.out.print("*");    
            System.out.println();
        }

        for(int d =(lay+1)/2-1;d >= 1; d --){
            for(int b = 1; b <= (lay+1)/2-d; b++)
                System.out.print(" ");
            for(int c = (lay+1)/2-d; c <=(lay+1)/2-2+d; c ++)
                System.out.print("*");    
            System.out.println();
        }
    }
}

运行结果

	*
  ***
 *****
*******
 *****
  ***
   *

题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:一球从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:将一个正整数分解质因数。例如:输入90,打印出90=233*5。

程序分析:

对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:

1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。

3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

程序代码

import java.util.Scanner;
public class Demo03 {
    private static Scanner in;

	public static void fenjie(int n) {
        for (int i = 2; i <= n; i++) {
            if (n % i == 0) {
                System.out.print(i);
                if(n!=i){
                    System.out.print("*");
                }
                fenjie(n/i);
            }
        }
        System.exit(0);
    }

    public static void main(String[] args) {
        in = new Scanner(System.in);
        System.out.println("请输入N的值:");
        int n = in.nextInt();
        System.out.print( "分解质因数:" + n +"=");
        fenjie(n);
    }
}

运行结果

请输入N的值:
100
分解质因数:100=2*2*5*5

题8:给一个不多于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

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

假设三个字符串s1、s2、s3,验证s3是否是由s1和s2交错组成的。注意是s1与s2交错组成s2字符串。

两个字符串s和t交错的定义与过程如下,其中每个字符串都会被分割成若干非空子字符串:

s=s1+s2+...+sn
t=t1+t2+...+tm
|n-m|<=1

交错是s1+t1+s2+t2+s3+t3+...或者t1+s1+t2+s2+t3+s3+...

提示:a+b意味着字符串a和b连接。

示例1

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true

示例2

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出: false

程序代码

class Solution {

	public static void main(String[] args) {
		String s1 = "ab", s2 = "cd", s3 = "acbd";
		System.out.println(isInterleave(s1, s2, s3));
	}

	public static boolean isInterleave(String s1, String s2, String s3) {
		if ((s1.length() + s2.length()) != s3.length())
			return false;

		boolean[][] dp = new boolean[s2.length() + 1][s1.length() + 1];

		dp[0][0] = true;
		for (int i = 1; i <= s1.length(); i++) {
			dp[0][i] = dp[0][i - 1] && s1.charAt(i - 1) == s3.charAt(i - 1) ? true : false;
		}

		for (int i = 1; i <= s2.length(); i++) {
			dp[i][0] = dp[i - 1][0] && s2.charAt(i - 1) == s3.charAt(i - 1) ? true : false;
		}

		for (int i = 1; i < dp.length; i++) {
			for (int j = 1; j < dp[0].length; j++) {
				dp[i][j] = (dp[i][j - 1] && s1.charAt(j - 1) == s3.charAt(i + j - 1))
						|| (dp[i - 1][j] && s2.charAt(i - 1) == s3.charAt(i + j - 1));
			}
		}
		return dp[s2.length()][s1.length()];
	}
}

运行结果

true

题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:java-中如何计算出-1000-以内的所有完数

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

题13:企业发放的奖金根据利润提成。利润(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求应发放奖金总数

题14:什么是数据结构

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

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

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

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

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

题20:求s=aaaaaaaaaaaa...a的值其中a是一个0~9之间的数字。例如222222222222222此时共有5个数相加几个数相加有键盘控制。-

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

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

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

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

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

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/huo-yuelong/ebooks.git
git@gitee.com:huo-yuelong/ebooks.git
huo-yuelong
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891