原创

Java算法篇—Java经典面试算法题02期

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

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

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

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

5、求100之内的素数。

6、对10个数从小到大进行排序。

7、求一个3*3矩阵主对角线元素之和。

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


【问题九】有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


【问题十】给一个不多于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位数,判断它是不是回文数。即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

这是一个回文!


【问题十二】请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

下方区域查看答案解析!

-▼-

程序分析:

用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。


程序代码

import java.util.Scanner;

public class Demo12 {
	private static Scanner in;

	public static void main(String[] args) {
		char weekSecond;
		in = new Scanner(System.in);
		System.out.println("请输入星期的第一个字母:");
		String letter = in.next();
		if (letter.length() == 1) {
			char weekFirst = letter.charAt(0);
			switch (weekFirst) {
			case 'm':
			case 'M':
				System.out.println("星期一(Monday)");
				break;
			case 't':
			case 'T':
				System.out
						.print("由于星期二(Tuesday)与星期四(Thursday)均以字母T开头,故需输入第二个字母才能正确判断:");
				letter = in.next();
				if (letter.length() == 1) {
					weekSecond = letter.charAt(0);
					if (weekSecond == 'U' || weekSecond == 'u') {
						System.out.println("星期二(Tuesday)");
						break;
					} else if (weekSecond == 'H' || weekSecond == 'h') {
						System.out.println("星期四(Thursday)");
						break;
					} else {
						System.out.println("Error!");
						break;
					}
				} else {
					System.out.println("输入错误,只能输入一个字母,程序结束!");
					break;
				}
			case 'w':
			case 'W':
				System.out.println("星期三(Wednesday)");
				break;
			case 'f':
			case 'F':
				System.out.println("星期五(Friday)");
				break;
			case 's':
			case 'S':
				System.out
						.print("由于星期六(Saturday)与星期日(Sunday)均以字母S开头,故需输入第二个字母才能正确判断:");
				letter = in.next();
				if (letter.length() == 1) {
					weekSecond = letter.charAt(0);
					if (weekSecond == 'A' || weekSecond == 'a') {
						System.out.println("星期六(Saturday)");
						break;
					} else if (weekSecond == 'U' || weekSecond == 'u') {
						System.out.println("星期日(Sunday)");
						break;
					} else {
						System.out.println("Error!");
						break;
					}
				} else {
					System.out.println("输入错误,只能输入一个字母,程序结束!");
					break;
				}
			default:
				System.out.println("输入错误,不能识别的星期值第一个字母,程序结束!");
				break;
			}
		} else {
			System.out.println("输入错误,只能输入一个字母,程序结束!");
		}
	}
}


运行结果

请输入星期的第一个字母:

m

星期一(Monday)


【问题十三】求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 都是素数


【问题十四】对10个数从小到大进行排序

下方区域查看答案解析!

-▼-

程序分析:

可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。


程序代码

import java.util.Arrays;
import java.util.Scanner;

public class Demo14 {
	private static Scanner in;

	public static void main(String[] args) {
		System.out.println("请输入10个数:");
		in = new Scanner(System.in);
		int[] arr = new int[10];
		for (int i = 0; i < 10; i++) {
			arr[i] = in.nextInt();
		}
		System.out.println("原数组为:");
		for (int x : arr) {
			System.out.print(x + "\t");
		}
		Arrays.sort(arr);
		System.out.println();
		System.out.println("排序后为:");
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
	}
}


运行结果

请输入10个数:

12 33 33 32 56 73 13 56 89 92

原数组为:

12 33 33 32 56 73 13 56 89 92

排序后为:

12 13 32 33 33 56 56 73 89 92


【问题十五】求一个3*3矩阵主对角线元素之和。

下方区域查看答案解析!

-▼-

程序分析:

主对角线(principal diagonal)是从左上角到右下角的对角线。

利用双重for循环控制输入二维数组,再将a[i][j]累加后输出。


程序代码

public class Demo15 {
    public static void main(String[] args) {
        int sum = 0;
        int array[][] = { { 2, 7, 3 }, { 4, 9, 6 }, { 5, 1, 8 } };
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++) {
                if (i == j)
                    sum = sum + array[i][j];
            }
        System.out.println("对角线元素之和:" + sum);
    }
}


运行结果

对角线元素之和:19


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

下方区域查看答案解析!

-▼-

程序分析:

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


程序代码

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

关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

评论

  1. #1

    假诗人 (2018/03/19 11:46:38)回复
    很好的面试题很经典很实用特别适合高级工程师

分享:

支付宝

微信