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();
    }
}
目录
相关文章
|
6天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
5天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
6天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
6天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
6天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
6天前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
6天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
6天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)