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

全文字数: 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 实现一个快速排序。

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

/*
* 使用快速排序方法对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();
}
}
} }

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

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

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

/**
* 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;
}

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

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

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);
}
}

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

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

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(); }
}

回答完这些问题,丝音看着刘小牛微笑着点点头说:“”你基础还是挺不错的”。听到夸赞,刘小牛期待的看着丝音问:“那我能进入天堂了吗”。丝音笑着说:“天堂哪有那么好进”。你......未完待续
(本故事纯属虚构,如有雷同纯属巧合)

发布于 10:07

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

  1. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  2. 【数据结构&算法】10-串基础&KMP算法源码

    目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...

  3. 【数据结构&算法】11-树基础&二叉树遍历

    目录 前言 树的定义 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 定义 特点 形态 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序存储结构 二叉 ...

  4. Java面试题 Web+EJB & Spring+数据结构& 算法&计算机基础

    六.Web 部分:(共题:基础40 道,基础37 道,中等难度3 道) 122.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? [基础] 答:Web 容器加载Servlet ...

  5. 2018年最新Java面试题及答案整理(持续完善中…)

    2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...

  6. 精选30道Java笔试题附答案分析

    精选30道Java笔试题解答 都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑 ...

  7. Java学习之计算机基础(一)

    阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...

  8. 《Java从入门到失业》第一章:计算机基础知识(一):二进制和十六进制

    0 前言 最近7年来的高强度工作和不规律的饮食作息,压得我有些喘不过气,身体也陆续报警.2018年下半年的一场病,让我意识到了这个问题的严重性,于是开始强制自己有规律饮食和作息,并辅以健身锻炼,不到2 ...

  9. 初转java随感(一)程序=数据结构+算法

    大学刚学编程的时候,有一句很经典的话程序=数据结构+算法 今天有了进一步认识. 场景: 1.当前局面 (1)有现成的封装好的分页组件 返回结果是page.类型为:Page.包括 page 分页信息,d ...

随机推荐

  1. 响应式Web设计- Viewport

    什么是Viewport? viewport是用户网页的可视区域, 翻译为中文可以叫做"视区". 设置Viewport 一个常用的针对移动网页优化过的页面的Viewport meta ...

  2. 风格附加css

    #header #blogTitle { background: url("http://images.cnblogs.com/cnblogs_com/aiwuxia/1249780/o_1 ...

  3. CAP 可用性理解

    从容灾角度看可用性. 多机同时返回. 主通过 heart-beat 脑裂. 用 paxos. 性能远距离. 对整体压力较大. 从用户体验的角度看单数据可用性: 不考虑城市灾备的情况发生.只有单机房的 ...

  4. 【数位dp】bzoj1799: [Ahoi2009]self 同类分布

    各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...

  5. js获取移动端触摸坐标

    想在touchmove事件里监听手指按下的坐标,event.pageX获取的是undefined,changedTouches,targetTouches,touches也只获得到了鼠标按下时的坐标, ...

  6. 快速入门Sklearn

    主要确定sklearn的基本流程,然后把sklearn当做螺丝刀来用就行了,需要什么查什么. 基本流程 首先我们回顾一下机器学习的基本流程: 特征工程,包括了数据清洗,数据标准版化,特征选取,特征降维 ...

  7. bounds 和frame区别

    仔细看下这个图就知道了

  8. C++类指针初始化

    上面的代码会打印“A”. C++ 类指针定义的时候没有初始化的时候,居然可以安全的调用类内部的成员函数而不出错. 在网上查了一下:   初始化为NULL的类指针可以安全的调用不涉及类成员变量的类成员函 ...

  9. windows下在指定目录下打开命令行

    直接用cd的话比较麻烦,可以先进入制定目录后,按住shift键,鼠标右键可以选择“在此处打开命令窗口”

  10. 【Luogu】P1593因子和(唯一分解定理,约数和公式)

    题目链接 首先介绍两个定理. 整数唯一分解定理:任意正整数都有且只有一种方式写出素数因子的乘积表达式. \(A=(p1k1 p2k2 ...... pnkn \) 求这些因子的代码如下 ;i*i< ...