Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
刘小牛是一名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 。
丝音
玉帝和王母最疼爱的女儿
哼,敢小瞧我们天堂的题,下一道题,排序都有哪几种方法?请列举说明,然后用JAVA 实现一个快速排序。
刘小牛
刘老儿家的二儿子
排序的方法有:插入排序:包括了直接插入排序、希尔排序;交换排序:包括了冒泡排序、快速排序;选择排序:包括了直接选择排序、堆排序;归并排序;分配排序:包括了桶排序、基数排序;
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();
}
}
回答完这些问题,丝音看着刘小牛微笑着点点头说:“”你基础还是挺不错的”。听到夸赞,刘小牛期待的看着丝音问:“那我能进入天堂了吗”。丝音笑着说:“天堂哪有那么好进”。你......未完待续
(本故事纯属虚构,如有雷同纯属巧合)
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
- 学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
- .NET Core多平台开发体验[4]: Docker
- .NET Core多平台开发体验[3]: Linux (Windows Linux子系统)
- .NET Core多平台开发体验[2]: Mac OS X
- .NET Core多平台开发体验[1]: Windows
- 如何远程关闭一个ASP.NET Core应用?
- 【深度学习】谷歌deepdream原理及tensorflow实现
- 【深度学习】写诗机器人tensorflow实现
- PyTorch还是TensorFlow?这有一份新手指南
- Leetcode 300. Longest Increasing Subsequence
- Leetcode 299. Bulls and Cows
- Leetcode 297. Serialize and Deserialize Binary Tree
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「Mysql优化大师三」查询执行计划explain详解,含案例
- flutter BottomAppBar实现不规则底部导航栏
- Yarr:一个UI很漂亮的RSS阅读器
- kotlin Standard中的内联函数示例详解
- 解决react-native软键盘弹出挡住输入框的问题
- flutter编写精美的登录页面
- Flutter实现App功能引导页
- Flutter底部不规则导航的实现过程
- Flutter实现用视频背景的登录页的示例代码
- Flutter实现可循环轮播图效果
- Android判断登录情况
- linux尝试登录失败后锁定用户账户的两种方法
- Linux内存泄漏检测shell脚本
- 详解Linux系统中网卡MAC地址克隆方法
- linux下日志定时轮询的流程详解