Java面试题总汇

简介:

6位短信验证码(不以0开头)

1
2
3
4
5
6
7
8
9
10
11
12
13
String random = String.valueOf(Math.random());
boolean start = false;
StringBuilder sb = new StringBuilder();
for (int i = 2,k = 0; k < 6 && i < random.length(); i++) {
if (!start && random.charAt(i) == '0')
continue;
else {
start = true;
sb.append(random.charAt(i));
k++;
}
}
System.out.println(sb.toString());

求从10到100中能被3或5整除的数的和

1
2
3
4
5
6
7
8
private static final int faceQuestions1() {
int sum = 0;
for (int i = 10; i <= 100; i++) {
if (i % 3 == 0 || i % 5 == 0)
sum += i;
}
return sum;
}

将一个字符串逆序,不要使用反转函数

1
2
3
4
5
6
private static final String faceQuestions2(String originalStr) {
StringBuilder sb = new StringBuilder();
for (int i = originalStr.length() - 1; i >= 0; i--)
sb.append(originalStr.charAt(i));
return sb.toString();
}

反转一个栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private static final void faceQuestions3() {
Stack<String> items = new Stack<>();
items.push("my");
items.push("name");
items.push("is");
items.push("benjamin");
revertStack(items);
System.out.println(items);
}

private static final <E> void revertStack(Stack<E> stack) {
Queue<E> queue = new LinkedList<>();
while (stack.size() > 0)
queue.offer(stack.pop());
while (queue.size() > 0)
stack.push(queue.poll());
}

Date转换字符串


给定一个java.util.Date对象,如何转化为”2007-3-22 20:23:22”格式的字符串
我这里用一种简单的方式,不使用SimpleDateFormat

1
2
3
private static void formatDate(Date date) {
System.out.printf("%TF %<TT", date);
}


如何判断一个数是否是素数

1
2
3
4
5
6
7
8
9
10
11
private static void checkPrimeNumber(int num) {
for (int i = 2; i < num/2; ++i) {
if (num % i == 0) {
System.out.println("不是素数");
break;
}
if (i == num/2 - 1) {
System.out.println(num + "是素数");
}
}
}

如何得到一个数的阶乘

阶乘举个例子吧:6的阶乘是 6 2 * 1

1
2
3
4
5
6
private static int factorial(int num) {
if (num == 1) {
return 1;
}
return num * factorial(num - 1);
}

二分法查找

写一个方法,用二分查找法判断任意整数在任意整数数组里面是否存在,若存在就返回它在数组中的索引位置,不存在返回-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* 二分法查找,使用递归
* @param originArr
* @param num
* @param startIndex
* @param endIndex
* @return
*/

private static int binarySearch(int[] originArr, int num, int startIndex, int endIndex) {
int index = (startIndex + endIndex) / 2;
if (startIndex < 0 || endIndex > originArr.length || num < originArr[startIndex] || num > originArr[endIndex]) {
throw new IllegalArgumentException("输入的参数不规范,请重新输入");
}
if (num < originArr[index]) {
return binarySearch(originArr, num, startIndex, index);
} else if (num > originArr[index]) {
return binarySearch(originArr, num, index, endIndex);
} else {
return index;
}
}

/**
* 二分法查找,不适用递归
* @param originArr
* @param num
* @return
*/

private static int binarySearch(int[] originArr, int num) {
int index = -1;
int startIndex = 0;
int endIndex = originArr.length - 1;
while (startIndex <= endIndex) {
index = (startIndex + endIndex) / 2;
if (num < originArr[index]) {
endIndex = index;
} else if (num > originArr[index]) {
startIndex = index;
} else {
break;
}
}
return index;
}

数组移动


定义一个int型的一维数组,包含10个元素,然后将数组中的元素都向前移一个位置,即,a[0]=a[1],a[1]=a[2],…最后一个元素的值是原来第一个元素的值,然后输出这个数组。

1
2
3
4
5
private static void moveArray(int a[]) {
int[] b = new int[a.length];
System.arraycopy(a, 1, b, 0, a.length-1);
b[b.length-1] = a[0];
}


杨辉三角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static void yanghuiTriangle(int row) {
int triangle[][] = new int[row][];
for (int i = 0; i < triangle.length; ++i) {
triangle[i] = new int[i+1];
for (int j = 0; j < triangle.length-i-1; ++j) {
System.out.print(" ");
}
for (int j = 0; j <= i; ++j) {
if (i == 0 || j == 0 || j == i) {
triangle[i][j] = 1;
} else {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
System.out.print(triangle[i][j] + " ");
}
System.out.println();
}
}

输出结果

1
2
3
4
5
6
7
8
9
10
         1 
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

输入数字,输出中文大写


如输入101,输出壹佰零壹
输入100010,输出拾万零壹拾
自己闲来无聊就写了一个小程序,希望大家多测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* 生成中文描述的数字串
* @param originStr
* @return
*/

private static String generateChinese(String originStr) {
String pointStr = "";
// 小数处理
if (originStr.contains(".")) {
pointStr = originStr.substring(originStr.indexOf('.') + 1); // 得到小数点后的数
originStr = originStr.substring(0, originStr.indexOf('.'));
}
originStr = filterStartWithZero(originStr); // 去除前面的0
StringBuilder sb = new StringBuilder();
for (int i = 0; i < originStr.length(); ++i) {
if (i % 4 == 0) {
if (i / 4 == 1) {
sb.append("万");
} else if (i / 4 == 2) {
sb.append("亿");
}
} else {
if (i % 4 == 1) {
sb.append("十");
} else if (i % 4 == 2) {
sb.append("百");
} else if (i % 4 == 3) {
sb.append("千");
}
}
sb.append(getChinese(originStr.charAt(originStr.length()-i-1)));
}
String result = reverse(sb.toString());
result = filterAfterGenerate(result); // 小数点之前的数处理完毕

/** 处理小数点后的数 **/
StringBuilder pointSB = new StringBuilder();
if (!"".equals(pointStr)) {
for (int i = 0; i < pointStr.length(); ++i) {
pointSB.append(getChinese(pointStr.charAt(i)));
}
result = result + "点" + pointSB.toString();
}
return result;
}

/**
* 最后产生结果后进行过滤,把不相关的数据替换掉
* @param originStr
* @return
*/

private static String filterAfterGenerate(String originStr) {
String[] filterData = {"零亿", "零万", "零千", "零百", "零十", "零零"};
String[] replaceData = {"亿", "万", "零", "零", "零", "零"};
int flag = 0;
/** 替换filterData中的数据为replaceData中的数据 **/
while (true) {
for (int i = 0; i < filterData.length; ++i) {
if (!originStr.contains(filterData[i])) {
flag++;
} else {
flag = 0;
originStr = originStr.replace(filterData[i], replaceData[i]);
}
}
if (flag == filterData.length) {
break;
} else {
flag = 0;
}
}
/** 去除末尾的零,比如 20: 二十零 **/
while (originStr.endsWith("零")) {
originStr = originStr.substring(0, originStr.length()-1);
}
return originStr.equals("") ? "零" : originStr; // 如果是空,就返回零
}

/**
* 根据传入的数字得到中文
* @param num
* @return
*/

private static char getChinese(char num) {
char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char[] chinese = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
for (int i = 0; i < digit.length; ++i) {
if (digit[i] == num) {
return chinese[i];
}
}
return '零';
}

/**
* 反转字符串
* @param str
* @return
*/

private static String reverse(String str) {
StringBuilder sb = new StringBuilder();
for (int i = str.length() - 1; i >= 0; --i) {
sb.append(str.charAt(i));
}
return sb.toString();
}

/**
* 去除输入字符串开头的零,如:0023输出为23
* @param originStr
* @return
*/

private static String filterStartWithZero(String originStr) {
int i = 0;
for (; i < originStr.length(); ++i) {
if (originStr.charAt(i) != '0') {
break;
}
}
return originStr.substring(i);
}

public static void main(String[] args) {
System.out.println(generateChinese("100010220.2")); // 壹亿零壹万零贰百贰十点贰
System.out.println(generateChinese("12003.2341")); // 壹万贰千零叁点贰叁肆壹
System.out.println(generateChinese("0000.00")); // 零点零零
System.out.println(generateChinese("00001.230")); // 壹点贰叁零
System.out.println(generateChinese("12003943490.12")); // 壹百贰十亿零叁百玖十肆万叁千肆百玖十点壹贰
}


输出九九乘法表

private static void nineNineMulitTable() {
    for (int i = 1; i <= 9; ++i) {
        for (int j = 1; j <= i; ++j) {
            System.out.print(i + "*" + j + "=" + (i * j) + "\t");
        }
        System.out.println();
    }
}
目录
相关文章
|
12天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
42 2
|
1天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
21 14
|
17天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
23天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
19天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
41 4
|
20天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
70 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
96 1
Java面试题之Java集合面试题 50道(带答案)
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
55 5
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
22 1
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
30 3
下一篇
无影云桌面