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

640?wx_fmt=gif 点击“蓝字”关注我吧

640?wx_fmt=png

全文字数:   1703

阅读时间:   大约6 分钟

640?wx_fmt=png

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

xmorient

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

你知道一个byte 几个bit位吗?

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

这个问题太简单了,一个Byte是8bit。

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

unix常用命令有:

ls  显示指定目录下的文件目录清单相当于dos下的dir命令。

pwd 显示当前目录。

mkdir  在当前目录下创建目录。

rm 删除文件或目录。

cp 复制文件。

mv 移动文件。

cd 切换工作目录。

ps 查看进程。

ftp 传送文件。

telnet 远程登录命令。

ping 用来测试本机与目标主机是否联通。

env  查看当前系统中的环境变量。

more 分屏显示指定文件的内容。

echo在终端上显示你要显示的内容,向C语言中的printf函数。

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

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

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

排序的方法有:插入排序:包括了直接插入排序、希尔排序;交换排序:包括了冒泡排序、快速排序;选择排序:包括了直接选择排序、堆排序;归并排序;分配排序:包括了桶排序、基数排序;

Java快速排序的代码如下:

/*	
 * 使用快速排序方法对arr[0:n- 1]排序	
从a[ 0 :n- 1 ]中选择一个元素作为middle,该元素为支点;	
把余下的元素分割为两段left 和right,使得left 中的元素都小于等于支点,	
而right 中的元素都大于等于支点;	
递归地使用快速排序方法对left 进行排序;	
递归地使用快速排序方法对right 进行排序;	
所得结果为left + middle + right。	
 	
 */	
public class QuickSort {	
   public static void main(String[] args) {	
      int[] arr = {5,2,4,9,7,16,26,3};	
      sort(arr, 0, arr.length - 1);	
   }	
 	
   public static void sort(int arr[], int left, int hight) {	
      int l = left;	
      int h = hight;	
      int k = arr[left];	
      while (l < h) {	
        //  从后往前比较	
        //  如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,	
        // 然后再从前往后比较	
        while (l < h && arr[h] > k) {	
           h--;//  h=6	
        }	
        // 交换位置	
        if (l < h) {	
           int temp = arr[h];	
           arr[h] = arr[l];	
           arr[l] = temp;	
           // 进行过一次替换后,没必要将替换后的两值再次比较,所以i++直接下一位与k对比	
           l++;	
        }	
        //  从前往后比较 如果没有比关键值大的,比较下一个,	
        // 直到有比关键值大的交换位置	
        while (l < h && arr[l] <= k) {	
           l++;	
        }	
        // 交换位置	
        if (l < h) {	
           int temp = arr[h];	
           arr[h] = arr[l];	
           arr[l] = temp;	
           h--;	
        }	
        //  此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,	
        // 但是左右两边的顺序还有可能是不一样的,进行下面的递归调用	
      }	
      print(arr);	
      System.out.print("l=" + (l + 1) + ",h=" + (h + 1) + ",k=" + k + "\n");	
      //  递归,先判断l>low再次进行左边排序	
      if (l > left) {	
        //  左边序列。第一个索引位置到关键值索引-1	
        sort(arr, left, l - 1);	
      }	
      // 左边依次排序执行完递归后,弹栈进行右边排序	
      if (h < hight) {	
        //  右边序列。从关键值索引+1到最后一个	
        sort(arr, l + 1, hight);	
      }	
   }	
 	
   //  打印数组的方法	
   public static void print(int[] arr) {	
      System.out.print("[");	
      for (int i = 0; i < arr.length; i++) {	
        if (i != (arr.length - 1)) {	
           System.out.print(arr[i] + ",");	
        } else {	
           System.out.print(arr[i] + "]");	
           System.out.println();	
        }	
      }	
   }	
 	
}

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

 

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

程序如下:

/**	
     * 1、偶数不可能是质数	
     * 2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除	
     */	
    public boolean isPrimeNum(int num) {	
        // 2特殊处理	
        if (num == 2) {	
            return true;	
        }	
        // 识别小于2的数和偶数	
        if (num < 2 || num % 2 == 0) {	
            return false;	
        }	
        int max = num / 2;	
        for (int i = 3; i < max; i += 2) {	
            if (num % i == 0) {	
                return false;	
            }	
        }	
        return true;	
    }	

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

这道题难不倒我

代码如下:

public class CountGame {	
    //判断第n个人是否已经出列	
    private static boolean same(int[] p, int l, int n) {	
       for (int i = 0; i < l; i++) {	
           if (p[i] == n) {	
              return true;	
           }	
       }	
       return false;	
    }	
 	
    public static void play(int playerNum, int step) {	
       //按出列顺序排列的新数组	
       int[] p = new int[playerNum];	
       //当前报数的人	
       int counter = 1;	
       while (true) {	
           if (counter > playerNum * step) {	
              break;	
           }	
           //从1开始报数	
           for (int i = 1; i < playerNum + 1; i++) {	
              while (true) {	
                  //如果报数的人已经出去,则跳过	
                  if (same(p, playerNum, i) == false){	
                     break;	
                  }	
                  else{	
                     i = i + 1;	
                  }	
              }	
              if (i > playerNum){	
                  break;	
              }	
              //如果当前报数的人是第m个人,则第M个人出列	
              if (counter % step == 0) {	
                  System.out.print(i + " ");	
                  p[counter / step - 1] = i;	
              }	
              counter += 1;	
           }	
       }	
       System.out.println();	
    }	
 	
    public static void main(String[] args) {	
       //一共10个人,输到第7个人出列	
       play(10, 7);	
    }	
}

丝音

玉帝和王母最疼爱的女儿

640?wx_fmt=png

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

640?wx_fmt=png

刘小牛

刘老儿家的二儿子

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

Java的代码实现如下:

//首先导入大数包和输入包	
import java.math.BigInteger;	
import java.util.Scanner;	
 	
//计算n!(1*2*...*n)	
public class BigIntegerTestDrive {	
    public static void main(String[] args) {	
       // 输入n	
       Scanner in = new Scanner(System.in);	
       int n = in.nextInt();	
 	
       // 输入初始值	
       int pre_answer = 1;	
       // 将初始值由int类型转变为String类型	
       String x = String.valueOf(pre_answer);	
       // 将String类型的的初始值,传递给BigInteger类型,	
       BigInteger answer = new BigInteger(x);	
 	
       // 循环迭代逐次相乘	
       for (int i = 1; i <= n; i++) {	
 	
           // 因为BigInteger类型只能和该类型的变量相乘,因此还需将每次的中间乘数也依次变为BigInteger类型	
           String var = String.valueOf(i);	
           BigInteger variable = new BigInteger(var);	
 	
           // 调用相乘函数进行相乘运算	
           answer = answer.multiply(variable);	
 	
       }	
       // 输出最终答案	
       System.out.println(answer);	
       in.close();	
 	
    }	
}

 

回答完这些问题,丝音看着刘小牛微笑着点点头说:“”你基础还是挺不错的”。听到夸赞,刘小牛期待的看着丝音问:“那我能进入天堂了吗”。丝音笑着说:“天堂哪有那么好进”。你......未完待续

(本故事纯属虚构,如有雷同纯属巧合)

640?wx_fmt=gif 欢我们的内容就点“在看”分享给小伙伴哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值