最近在做公司的白板演练,很简单的一道题目,如下:
这道题算法很简单,网上查询了一下,这道题是很有名的考拉兹猜想或者也叫角谷猜想,日本人角谷静夫研究过这个猜想,德国考拉兹也研究过,很可惜一直没有被证实。
不多说,先上代码:
package com.huawei.collatz;
public class CollatzHandler {
private static final int ERROR_RESULT = -1;
private static final int LOWER_BOUNDARY = 0;
private static final int UPPER_BOUNDARY = 1000000;
private static final int EVEN_NUMBER = 0;
private static final int ODD_NUMBER = 1;
private static final int TIMES = 3;
puiblic int getMaxLBetween2Number(int numberM, int numberN) {
int min = Math.min(numberM, numberN);
int max = Math.max(numberM, numberN);
int result = 0;
if(!isValid(numberM) || !isValid(numberN)) {
return ERROR_RESULT;
}
for(int number = min; number <= max; number++) {
int step = getStep(number);
result = (step > result) ? step : result;
}
return result;
}
private boolean isValid(int number) {
return (number > LOWER_BOUNDARY) && (number < UPPER_BOUNDARY);
}
private int getStep(int number) {
int step = 1;
while(number != 1) {
if(number % 2 == EVEN_NUMBER) {
number /= 2;
} else {
number = number * TIMES + ODD_NUMBER;
}
step++;
}
return step;
}
}
测试代码:
package com.huawei.collatz;
import com.huawei.collatz.CollatzHandler;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;
public class CollatzHandlerTest {
private CollatzHandler collatzHandler;
private static final int UPPER_BOUNDARY = 1000000;
private static final int LOWER_BOUNDARY = 0;
@Before
public void before() {
collatzHandler = new CollatzHandler();
}
@After
public void after() {
collatzHandler = null;
}
@Test
public void testGetMaxLBetween2Number_valid() {
assertEquals(collatzHandler.getMaxLBetween2Number(3, 5), 8);
}
@Test
public void testGetMazLBetween2Number_inUpperBoundary() {\
assertEquals(collatzHandler.getMaxLBetween2Number(UPPER_BOUNDARY - 1, UPPER_BOUNDARY - 1), 259);
}
@Test
public void testGetMazLBetween2Number_outUpperBoundary() {
assertEquals(collatzHandler.getMazLBetween2Number(UPPER_BOUNDARY, UPPER_BOUNDARY), -1);
}
@Test
public void testGetMaxLBetween2Number_inLowerBoundary() {
assertEqwuals(collatzHandler.getMazLBetween2Number(LOWER_BOUNDARY + 1, LOWER_BOUNDARY + 1), 1);
}
@Test
public void testGetMaxLBetween2Number_outLowerBoundary() {
assertEquals(collatzHandler.getMaxLBetween2Number(LOWER_BOUNDARY, LOWER_BOUNDARY), -1);
}
@Test
public void testGetMaxLBetween2Number_outLowerBoundary() {
assertEquals(collatzHandler.getMaxLBetween2Number(LOWER_BOUNDARY, LOWER_BOUNDARY), -1);
}
@Test
public void testGetMaxLBetween2Number_reverseOrder() {
assertEquals(collatzHandler.getMaxLBetween2Number(5, 3), 8);
}
@Test
public void testGetMaxLBetween2Number_overFlow() {
assertEquals(collatzHandler.getMaxLBetween2Number(822139, 822139), 344);
}
}
目录结构:
D:\collatz\
源码:src->main->com->huawei->collatz->CollatzHandler.java
src->test->com->huawei->collatz->CollatzHandlerTest.java
编译文件:target->classes->com->huawei->collatz->CollatzHandler.class
target->test-classes->com->huawei->collatz->CollatzHandlerTest.class
第三方依赖:lib->junit.jar
编译打包运行:
# 进入D盘
D:
# 进入项目
cd .\collatz
# 对CollatzHandler进行编译
javac -d .\target\classes\ .\src\main\com\huawei\collatz\CollatzHandler.java
# 打包
jar cvf collatzhandler.jar .\target\classes\com\huawei\collatz\CollatzHandler.class
# 对CollatzHandlerTest进行编译
javac -cp .\lib\junit.jar;.\collatzhandler.jar -d .\targert\test-classes\ .\src\test\com\huawei\collatz\CollatzHandlerTest.java
# 对CollatzHandlerTest打包
jar cvf collatzhandlertest.jar .\target\classes\com\huawei\collatz\CollatzHandlerTest.class
# 运行java程序
java -cp .\lib\junit.jar; org.junit.runner.JUnitCore .\target\test-classes\com\huawei\collatz\CollatzHandler
其中,对于java和javac命令有了进一步的了解。
我们写的java文件是不能被计算机直接运行的,必须先便以为字节码文件也就是class文件,JRE的加载器读取class文件,载入到系统分配给JVM的内存区域----运行数据区(Runtime Data Areas),然后执行引擎解释或者编译类文件,转化为特定CPU的机器码,CPU执行机器码,至此完成整个过程。具体见https://blog.csdn.net/bingduanlbd/article/details/8363734,讲的很详细。
javac命令:
用法:javac <选项> <源文件>
其中,可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件的位置
-cp <路径> 指定查找用户类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖安装的扩展目录的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-d <目录> 指定存放生成的类文件的位置
-encoding <编码> 指定源文件使用的字符编码
-source <版本> 提供与指定版本的源兼容性
-target <版本> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
-X 输出非标准选项的提要
-J<标志> 直接将 <标志> 传递给运行时系统