Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)

Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)

全文字数: 1703

阅读时间: 大约6 分钟

刘小牛是一名Java程序员,由于天天996平常也不注意锻炼身体,一不小心就进入了ICU,最终抢救无效,告别了人间。死后的刘小牛,被告知需要进入天堂或者地狱,进入天堂需要有一技之长,刘小牛当然想进入天堂了,他思来想去自己也只会敲代码了,所以他来到了天堂的大门前,准备应聘Java程序员,玉帝和王母最疼爱的女儿丝音接待了他,丝音对他说,想要应聘我们天堂的程序员可不简单,我需要问你几个问题,答对了我们才会录用你,让你进入天堂工作,否则你还是去地狱吧,刘小牛说没问题,我这么多年程序员也不是白干的,这点我还是有信心的。下面是他和丝音的对话。

丝音:你知道一个byte 几个bit位吗?

刘小牛:这个问题太简单了,一个Byte是8bit。

丝音:常用UNIX 命令有哪些(Linux 的常用命令)(至少10 个)?

刘小牛:unix常用命令有:

ls 显示指定目录下的文件目录清单相当于dos下的dir命令。
pwd 显示当前目录。
mkdir 在当前目录下创建目录。
rm 删除文件或目录。
cp 复制文件。
mv 移动文件。
cd 切换工作目录。
ps 查看进程。
ftp 传送文件。
telnet 远程登录命令。
ping 用来测试本机与目标主机是否联通。
env 查看当前系统中的环境变量。
more 分屏显示指定文件的内容。
echo在终端上显示你要显示的内容,向C语言中的printf函数。

丝音:嗯嗯不错,下一个问题,后序遍历下列二叉树,访问结点的顺序是什么?

刘小牛:这问题也太简单了,访问顺序为:DJGEBKNIFCA 。:顺序为:DJGEBKNIFCA 。

丝音:哼,敢小瞧我们天堂的题,下一道题,排序都有哪几种方法?请列举说明,然后用JAVA 实现一个快速排序。

刘小牛:排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(桶排序、基数排序);


  
  1. /*
  2. * 使用快速排序方法对arr[0:n- 1]排序
  3. 从a[ 0 :n- 1 ]中选择一个元素作为middle,该元素为支点;
  4. 把余下的元素分割为两段left 和right,使得left 中的元素都小于等于支点,
  5. 而right 中的元素都大于等于支点;
  6. 递归地使用快速排序方法对left 进行排序;
  7. 递归地使用快速排序方法对right 进行排序;
  8. 所得结果为left + middle + right。
  9. */
  10. public class QuickSort {
  11. public static void main(String[] args) {
  12. int[] arr = {5,2,4,9,7,16,26,3};
  13. sort(arr, 0, arr.length - 1);
  14. }
  15. public static void sort(int arr[], int left, int hight) {
  16. int l = left;
  17. int h = hight;
  18. int k = arr[left];
  19. while (l < h) {
  20. // 从后往前比较
  21. // 如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,
  22. // 然后再从前往后比较
  23. while (l < h && arr[h] > k) {
  24. h--;// h=6
  25. }
  26. // 交换位置
  27. if (l < h) {
  28. int temp = arr[h];
  29. arr[h] = arr[l];
  30. arr[l] = temp;
  31. // 进行过一次替换后,没必要将替换后的两值再次比较,所以i++直接下一位与k对比
  32. l++;
  33. }
  34. // 从前往后比较 如果没有比关键值大的,比较下一个,
  35. // 直到有比关键值大的交换位置
  36. while (l < h && arr[l] <= k) {
  37. l++;
  38. }
  39. // 交换位置
  40. if (l < h) {
  41. int temp = arr[h];
  42. arr[h] = arr[l];
  43. arr[l] = temp;
  44. h--;
  45. }
  46. // 此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,
  47. // 但是左右两边的顺序还有可能是不一样的,进行下面的递归调用
  48. }
  49. print(arr);
  50. System.out.print("l=" + (l + 1) + ",h=" + (h + 1) + ",k=" + k + "\n");
  51. // 递归,先判断l>low再次进行左边排序
  52. if (l > left) {
  53. // 左边序列。第一个索引位置到关键值索引-1
  54. sort(arr, left, l - 1);
  55. }
  56. // 左边依次排序执行完递归后,弹栈进行右边排序
  57. if (h < hight) {
  58. // 右边序列。从关键值索引+1到最后一个
  59. sort(arr, l + 1, hight);
  60. }
  61. }
  62. // 打印数组的方法
  63. public static void print(int[] arr) {
  64. System.out.print("[");
  65. for (int i = 0; i < arr.length; i++) {
  66. if (i != (arr.length - 1)) {
  67. System.out.print(arr[i] + ",");
  68. } else {
  69. System.out.print(arr[i] + "]");
  70. System.out.println();
  71. }
  72. }
  73. }
  74. }

刘小牛把在纸上写好的代码递给了丝音。

丝音:嗯嗯,写的不错,看不出来你还挺厉害的呀,好再问你一个简单的问题,写一个程序判断数字是否为质数?

刘小牛:这个简单,程序如下:


  
  1. /**
  2. * 1、偶数不可能是质数
  3. * 2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除
  4. */
  5. public boolean isPrimeNum(int num) {
  6. // 2特殊处理
  7. if (num == 2) {
  8. return true;
  9. }
  10. // 识别小于2的数和偶数
  11. if (num < 2 || num % 2 == 0) {
  12. return false;
  13. }
  14. int max = num / 2;
  15. for (int i = 3; i < max; i += 2) {
  16. if (num % i == 0) {
  17. return false;
  18. }
  19. }
  20. return true;
  21. }

丝音:给你出一道难得吧,这个题有好多以前应聘的人都没答对呢,设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出出列的顺序;要求用java 实现。

刘小牛:这道题难不倒我,代码如下:


  
  1. public class CountGame {
  2. //判断第n个人是否已经出列
  3. private static boolean same(int[] p, int l, int n) {
  4. for (int i = 0; i < l; i++) {
  5. if (p[i] == n) {
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
  11. public static void play(int playerNum, int step) {
  12. //按出列顺序排列的新数组
  13. int[] p = new int[playerNum];
  14. //当前报数的人
  15. int counter = 1;
  16. while (true) {
  17. if (counter > playerNum * step) {
  18. break;
  19. }
  20. //从1开始报数
  21. for (int i = 1; i < playerNum + 1; i++) {
  22. while (true) {
  23. //如果报数的人已经出去,则跳过
  24. if (same(p, playerNum, i) == false){
  25. break;
  26. }
  27. else{
  28. i = i + 1;
  29. }
  30. }
  31. if (i > playerNum){
  32. break;
  33. }
  34. //如果当前报数的人是第m个人,则第M个人出列
  35. if (counter % step == 0) {
  36. System.out.print(i + " ");
  37. p[counter / step - 1] = i;
  38. }
  39. counter += 1;
  40. }
  41. }
  42. System.out.println();
  43. }
  44. public static void main(String[] args) {
  45. //一共10个人,输到第7个人出列
  46. play(10, 7);
  47. }
  48. }

丝音:哇,你真厉害呀,最后一个问题,用程序实现1000 的阶乘

刘小牛:这个问题有个陷阱,就是普通的数据类型存不了这么大的数,不过这难不倒我的,嘿嘿

Java的代码实现如下:


  
  1. //首先导入大数包和输入包
  2. import java.math.BigInteger;
  3. import java.util.Scanner;
  4. //计算n!(1*2*...*n)
  5. public class BigIntegerTestDrive {
  6. public static void main(String[] args) {
  7. // 输入n
  8. Scanner in = new Scanner(System.in);
  9. int n = in.nextInt();
  10. // 输入初始值
  11. int pre_answer = 1;
  12. // 将初始值由int类型转变为String类型
  13. String x = String.valueOf(pre_answer);
  14. // 将String类型的的初始值,传递给BigInteger类型,
  15. BigInteger answer = new BigInteger(x);
  16. // 循环迭代逐次相乘
  17. for (int i = 1; i <= n; i++) {
  18. // 因为BigInteger类型只能和该类型的变量相乘,因此还需将每次的中间乘数也依次变为BigInteger类型
  19. String var = String.valueOf(i);
  20. BigInteger variable = new BigInteger(var);
  21. // 调用相乘函数进行相乘运算
  22. answer = answer.multiply(variable);
  23. }
  24. // 输出最终答案
  25. System.out.println(answer);
  26. in.close();
  27. }
  28. }
回答完这些问题,丝音看着刘小牛微笑着点点头说:“”你基础还是挺不错的”。听到夸赞,刘小牛期待的看着丝音问:“那我能进入天堂了吗”。丝音笑着说:“天堂哪有那么好进”。你......未完待续
(本故事纯属虚构,如有雷同纯属巧合)

 

 

文章来源: albertyang.blog.csdn.net,作者:Albert Yang,版权归原作者所有,如需转载,请联系作者。

原文链接:albertyang.blog.csdn.net/article/details/90486279

(完)