在面试过程中,经常会碰到一些算法相关的编程题,对于初学者来说着实头痛,下面就为大家梳理一下JAVA面试中一些比较常见的算法编程题;
如需转载,请注明出处,谢谢!(文章将会持续更新)
代码如下:
package com.tobiasy.toolkit.algorithm;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
* java中一些经典的算法(Algorithm)
*
* @author tobiasy
*/
public class ClassicJavaAlgorithm {
/**
* 问法一、斐波那契数或者费氏数列(Fibonacci数列)
* 问法二、有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
* 问每个月的兔子总数为多少?
* 1 1 2 3 5 8 13 ...
* <p>
* 递归算法
*
* @param n
* @return
*/
public static Long getNumber(int n) {
if (n < 0) {
return -1L;
} else if (n == 0) {
return 0L;
} else if (n == 1 || n == 2) {
return 1L;
} else {
return getNumber(n - 1) + getNumber(n - 2);
}
}
public static Long getFib(int n) {
return n <= 0 ? -1L : n == 1 || n == 2 ? 1L : getFib(n - 1) + getFib(n - 2);
}
/**
* 测试递归算法与传统循环效率相比
*/
public static final int MONTH = 40;
public static void fib_test() {
Long start = System.currentTimeMillis();
System.out.println(getFib(MONTH));
System.out.println("递归耗时:" + (System.currentTimeMillis() - start));
Long start1 = System.currentTimeMillis();
long f1 = 1L, f2 = 1L;
long f;
for (int i = 3; i <= MONTH; i++) {
f = f2;
f2 = f1 + f2;
f1 = f;
//System.out.print("第" + i +"个月的兔子对数: ");
//System.out.println(" " + f2);
}
System.out.println(f2);
System.out.println("非递归耗时:" + (System.currentTimeMillis() - start1));
}
/**
* 输出结果:
* 102334155
* 递归:1104
* 102334155
* 非递归:0
* 综上,递归算法虽然代码简单,但在效率上面远远低于普通循环算法
*/
/**
* 计算100-999的水仙花数字
* 打印出所有的"水仙花数(narcissus number)",所谓"水仙花数"是指一个三位数,
* 其各位数字立方和等于该数本身 。
* 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方 。
* result 153 370 371 407
*/
public static void narcissus() {
for (int i = 100; i < 1000; i++) {
int one = i / 100;
int two = i / 10 % 10;
int thr = i - i / 10 * 10;
int res = one * one * one + two * two * two + thr * thr * thr;
if (res == i) {
System.out.println(i);
}
}
}
/**
* 题目:获取一个数以内的所有质数(素数)
*
* @param size
*/
public static List<Integer> getPrime(int size) {
List<Integer> integers = new ArrayList<>();
for (int i = 2; i < size; i++) {
boolean f = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
f = false;
}
}
if (f) {
integers.add(i);
}
}
return integers;
}
/**
* 题目:将一个正整数分解质因数 。例如:输入90,打印出90=2*3*3*5 。
* 因式分解(factorization)
*
* @param num
*/
public static void factorization(int num) {
int orinNum = num;
List<Integer> is = getPrime(num + 1);
List<Integer> res = new ArrayList<>();
for (int i = 0; i < is.size(); i++) {
Integer integer = is.get(i);
if (num % integer == 0) {
res.add(integer);
num = num / integer;
i = 0;
}
}
StringBuffer sf = new StringBuffer();
sf.Append(orinNum + "=");
for (int i = 0; i < res.size(); i++) {
if (i < res.size() - 1) {
sf.append(res.get(i) + "*");
} else {
sf.append(res.get(i) + "");
}
}
System.out.println(sf.toString());
}
/**
* 题目:输入两个正整数,求其最小公倍数 。
*
* @param one
* @param two
* @return
*/
public static int leastCommonMultiple(int one, int two) {
int max = one > two ? one : two;
List<Integer> is = getPrime(max);
for (Integer integer : is) {
if (one % integer == 0 && two % integer == 0) {
return integer;
}
}
return -1;
}
/**
推荐阅读
- 11条MySQL规范,你知道的有几个? Java架构师追风 2019-08-28 16:36:08
- java虚拟机-jvm内存回收算法篇
- Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析
- B-Tree 数据结构详解及Java代码实现
- 机器学习算法中的7个损失函数的详细指南
- Java序列化是什么?你知道什么时候需要序列化吗?
- 如何挑选白牛肝菌
- 禅茶 茶道中的禅佛意韵
- 茶中的各种手势礼仪,都是什么含义呢?
- 茶席设计中的铺垫方法