面试题,大家看看如何来解决。我的答案如下,应该有更好的 爬楼梯: 一个楼梯有n阶,每次可以爬一阶或者二阶。比如,一个楼梯只有三阶,则共有3种爬法:
1) 第一次爬一阶,第二次爬两阶。
2)第一次爬一阶,第二次爬一阶,第三次爬一阶。
3)第一次爬两阶,第二次爬一阶。
问:如果楼梯是5阶,共有多少中爬法,并把每种爬法打印出来。请用程序实现。
(1) 8 种
public static void count(){
for(int i=1;i<=4;i++){//总会有1步出现,根据1出现的次数组合
switch(i){
case 1:
System.out.println("方法(1),1,2,2");
System.out.println("方法(2),2,2,1");
System.out.println("方法(3),2,1,2");
break;
case 2://与1步出现三次一样
System.out.println("方法(4), 1,1,1,2");
System.out.println("方法(5), 1,1,2,1");
System.out.println("方法(6), 1,2,1,1");
System.out.println("方法(7), 2,1,1,1");
break;
case 4://与1步出现5次一样
System.out.println("方法(8), 1,1,1,1,1");
break;
}
}
}
1) 第一次爬一阶,第二次爬两阶。
2)第一次爬一阶,第二次爬一阶,第三次爬一阶。
3)第一次爬两阶,第二次爬一阶。
问:如果楼梯是5阶,共有多少中爬法,并把每种爬法打印出来。请用程序实现。
(1) 8 种
public static void count(){
for(int i=1;i<=4;i++){//总会有1步出现,根据1出现的次数组合
switch(i){
case 1:
System.out.println("方法(1),1,2,2");
System.out.println("方法(2),2,2,1");
System.out.println("方法(3),2,1,2");
break;
case 2://与1步出现三次一样
System.out.println("方法(4), 1,1,1,2");
System.out.println("方法(5), 1,1,2,1");
System.out.println("方法(6), 1,2,1,1");
System.out.println("方法(7), 2,1,1,1");
break;
case 4://与1步出现5次一样
System.out.println("方法(8), 1,1,1,1,1");
break;
}
}
}
{
private static int[] x;
private static int count = 0;
public static void climb(int n,int i)
{
if (n <= 0) {
System.out.printf("%-4d:",++count);
for (int step = 0;step < i;++step) {
System.out.printf("%-3d",x[step]);
}
System.out.println();
} else {
for (int step = 1;step <= 2;++step) {
if (n - step >= 0) {
x[i] = step;
climb(n - step,i + 1);
x[i] = 0;
}
}
}
}
public static void init(int n)
{
x = new int[n];
for (int i = 0;i < x.length;++i) {
x[i] = 0;
}
count = 0;
}
public static void main(String[] args)
{
init(5);
climb(5,0);
}}
public class Test
{
static Stack<Integer> s=new Stack<Integer>();
public static void main(String...args){
String[] s=new String[4];
s[0]="dd";
String[] s2={"aaa"};
outPut(5);
}
public static void outPut(int n){
if(n==0){
System.out.println(s);
}
if(n==1){
s.push(1);
System.out.println(s);
s.pop();
}
if(n==2){
s.push(2);
outPut(n-2);
s.pop();
s.push(1);
outPut(n-1);
s.pop();
}
if(n>2){
s.push(1);
outPut(n-1);
s.pop();
s.push(2);
outPut(n-2);
s.pop();
}
}
}
{
static Stack<Integer> s=new Stack<Integer>();
public static void main(String...args){
outPut(5);
}
public static void outPut(int n){
if(n==1){
s.push(1);
System.out.println(s);
s.pop();
}
if(n==2){
s.push(2);
System.out.println(s);
s.pop();
s.push(1);
outPut(n-1);
s.pop();
}
if(n>2){
s.push(1);
outPut(n-1);
s.pop();
s.push(2);
outPut(n-2);
s.pop();
}
}
}
printf("", 5);
}
public static void printf(String str, int number) {
if (number == 1) {
System.out.println(str + "1");
return;
} else if (number == 0) {
System.out.println(str);
return;
}
printf(str + "1", number - 1);
printf(str + "2", number - 2);
}
f(n)=f(n-1)+f(n-2)
迈到第N阶,或是由N-1过来或是N-2过来
NB的应该用循环代替递归,这个数小估计不是考察的目的
说来惭愧
这题我做了一个下午..
老师讲的课我都没听..public class ClimbLadderDemo {
private int count;
private StringBuffer buffer = new StringBuffer();
public static void main(String[] args) {
ClimbLadderDemo client = new ClimbLadderDemo();
client.climbLadder(5, new StringBuffer());
System.out.println("总共有" + client.count + "种结果:");
System.out.println(client.buffer);
}
public void climbLadder(int num, StringBuffer buffer) {
if(num <= 0) {
buffer.append("\n");
this.buffer.append(buffer);
count++;
return;
}
if(num == 1) {
buffer.append("1 ");
climbLadder(num - 1, new StringBuffer(buffer));
return;
}
climbLadder(num - 2, new StringBuffer(buffer).append("2 "));
climbLadder(num - 1, new StringBuffer(buffer).append("1 "));
}}
return g(0, n, new int[n]);
} private static int g(int c, int total, int[] arr) {
if (total == 0) {
for (int i = 0; i < c; i++) {
System.out.print(arr[i]);
}
System.out.println();
return 1;
}
int x = 0;
for (int i = 1; i <= 2 && total - i >= 0; i++) {
arr[c] = i;
x += g(c + 1, total - i, arr);
}
return x;
}
public class Test
{public static void main(String[] args)
{
int n=Integer.parseInt(args[0]);
int [] s=new int[n+1];
s[0]=0;s[1]=1;s[2]=2;
for (int i=3;i<=n;i++)
s[i]=s[i-1]+s[i-2];
int [][]ss=new int [s[n]+2][n+1];
for(int i=1;i<=s[n] ;i++){
ss[i][n]=n;}for (int j=n-1;j>0;j--){
for(int i=1,k=j;i<=s[n] ;){
//System.out.print(k+" ");
for(int m=1;k>0 && m<=s[k];m++){
ss[i][j]=k;
//System.out.print("ss["+i+"]["+j+"]="+ss[i][j]+" ");
i++;
}
//System.out.println();
if (k==0){i++;
k=ss[i][j+1]-1;}
else if ( ss[i-1][j+1]-ss[i-1][j]==2)
{k=ss[i][j+1]-1;}
else k--;
if (k<0) break;
}
}
for(int i=1;i<=s[n];i++){
for(int j=1;j<=n;j++){
System.out.print(ss[i][j]);}
System.out.println("");
}
}
}