Java
5
添加了
java.util.Scanner
类,这是一个用于扫描输入文本的新的实用程序。它是以
前的
StringTokenizer
和
Matcher
类之间的某种结合。由于任何数据都必须通过同一模式的
捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从
输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,
Scann输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,
1.斐波那契数列
Java中Scanner类这是一个用于扫描输入文本的
可以使用该类创建一个对象
Scanner reader=new Scanner(System.in);
然后reader调用下面的方法,读取用户在命令行输入的各种类型的数据
package mianshiti;
import java.util.*;
import java.io.*;
public class fibonacci {
public static int k=0;
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);//Scanner类这是一个用于扫描输入文本的
long a=cin.nextLong();//将输入信息的下一个标记扫描为一个long
System.out.println(fibonacci(a));
System.out.println("共调用了"+k+"次");
}
public static long fibonacci(long m){
if(m==0|m==1){
k++;
return m;
}else{
return fibonacci(m-1)+fibonacci(m-2);
}
}
}
递归的缺点:
会造成调用栈的溢出,因为需要为每一次函数调用在内存栈中分配空间,而每个进程的栈的容量是有限的。当递归调用层级太多时,就会超出栈的容量,从而导致调用栈溢出。
更简洁的方法:
可以直接从下往上算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3),依次类推可以算出第n项f(n),时间复杂度是O(n)
public class Solution {
public int Fibonacci(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
int numfn1=0;
int numfn2=1;
int currentfn=0;
for(int i=2;i<=n;i++){
currentfn=numfn1+numfn2;
numfn1=numfn2;
numfn2=currentfn;
}
return currentfn;
}
}
跳台阶:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数
public class Solution {
public int JumpFloor(int target) {
if(target==2||target==1){
return target;
}
// 第一阶和第二阶考虑过了,初始当前台阶为第三阶,向后迭代
// 思路:当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数
int jumpSum=0;//当前台阶的跳法总数
int jumpSumBackStep1=2;//当前台阶后退一阶的台阶的跳法总数
int jumpSumBackStep2=1;//当前台阶后退二阶的台阶的跳法总数
for(int i=3;i<=target;i++){
jumpSum=jumpSumBackStep1+jumpSumBackStep2;
jumpSumBackStep2=jumpSumBackStep1;// 后退一阶在下一次迭代变为后退两阶
jumpSumBackStep1=jumpSum;// 当前台阶在下一次迭代变为后退一阶
}
return jumpSum;
}
}
矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
√ | |||||||
√ |
√ | √ | ||||||
× | × |
public class Solution {
public int RectCover(int target) {
if (target < 1) {
return 0;
} else if (target == 1 || target == 2) {
return target;
} else {
return RectCover(target-1) + RectCover(target-2);
}
}
}
2.求100以内的素数
素数,是指在大于1的自然数中,除了1和它本身以外,不能被其他数整除的数。
合数,比1大但不是素数的。
1和0既非素数也非合数
如:2,3,5,7....
package mianshiti;
public class primenumber {
public static void main(String[] args) {
int n=0;//用来计算当前是第几个素数
for(int i=2;i<=100;i++){
if(isPrime(i)){
n++;
System.out.print(i+"\t");
if(n%10==0){//每10个数,换一次行
System.out.print("\n");
}
}
}
}
static boolean isPrime(int number){
for(int i=2;i<=Math.sqrt(number);i++){//用一个数除以其他数,只要除到这个数的根号Math.sqrt(number)就可以判断是否素数
if(number%i==0){
return false;
}
}
return true;
}
}