Java經典面試算法2

二:經典算法問題?

  2.1雞兔同籠問題(窮舉法)

           已知:雞兔共35只,共94只腳,那麼雞和兔各幾隻?

           示例代碼:

 1 public class SameCage {
 2     public static void main(String[] args) {
 3         //循環變量j,控制小雞的個數: 0到35遞增
 4         //循環變量t,控制兔子的個數: 35到0遞減
 5         for(int j=0,t=35; j<=35; j++,t--) {//如果有多個小條件,用逗號隔開
 6             //保證腳的數量是94
 7             if(j*2 + t*4 == 94) {
 8                 System.out.println("雞:"+j+", 兔:"+t);
 9             }
10         }
11     }
12 }

            輸出結果:

            雞:23, 兔:12

  2.2斐波那契問題

            已知:斐波那契數列的前幾個數分別爲0,1,1,2,3,5…從第三項開始,每一項都等於前兩項的和.請接收用戶輸入的整數n,求出此數列的前n項.

           斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……

          其規律很明顯,從第3個數開始,每個數都等於它前兩個數的和。

         下面我們可以通過用戶輸入的數字n來輸出斐波那契數列的前n項

         示例代碼:

 1 public class Faibonacci {
 2     public static void main(String[] args) {
 3         System.out.println("請輸入您要測試的數:");
 4         int n = new Scanner(System.in).nextInt();
 5         //判斷n是否是不正常的範圍
 6         if(n<1){
 7             System.out.println("輸入數據有誤!!!");
 8         }
 9         //n==1
10         if(n==1){
11             System.out.println(0);
12         }
13         //n==2
14         if(n==2){
15             System.out.println(0+"\t"+1);
16         }
17         //n==3
18         if(n==3){
19             System.out.println(0+"\t"+1+"\t"+1);
20         }
21         //拼接前n項
22         if(n>3){
23             System.out.print(0+"\t"+1+"\t"+1+"\t");
24         }
25         //循環輸出後面的數據
26         int f1=1;
27         int f2=1;
28         int next=0;
29         for(int i=4;i<=n;i++){
30             next=f1+f2;
31             f1=f2;
32             f2=next;
33             System.out.print(next+"\t");
34         }
35     }
36 }

            如: 輸入 10

            結果爲: 0 1 1 2 3 5 8 13 21 34

  2.3打印100以內除了尾數爲3,5,7的所有數

            示例代碼:       

 1 public class ForContinue {
 2     public static void main(String[] args) {
 3         System.out.println("結果爲:");
 4         for(int i=1;i<=100;i++) {
 5             int y = i%10;//100以內的數,通過取餘求出尾數
 6             if(y==3 || y==5 || y==7) {
 7                 continue;//如果尾數爲3 5 7 ,則跳過後面的打印,進行下一輪循環
 8             }
 9             System.out.print(" "+i);
10         }
11     }
12 }

           輸出結果:  1 2 4 6 8 9 10 11 12 14 16 18 19 20 21 22 24 26 28 29 30 31 32 34 36 38 39 40 41 42 44 46 48 49 50 51 52 54 56 58 59 60 61

         62 64 66 68 69 70 71 72 74 76 78 79 80 81 82 84 86 88 89 90 91 92 94 96 98 99 100

  2.4求猴子大王

              15個猴子圍成一圈選大王,依次1-7循環報數,報到7的猴子被淘汰,直到最後一隻猴子稱爲大王,問:哪隻猴子會成爲大王?

              示例代碼:

 1 public class MonkeyKing {
 2     public static void main(String[] args) {
 3         //1.定義長度爲15的數組保存猴子,boolean類型是爲了判斷猴子是否存活
 4         boolean[] b=new boolean[15];
 5 
 6         //2.依次遍歷每一隻猴子
 7         //true---未淘汰  false---已淘汰
 8         for(int i=0;i<b.length;i++){
 9             b[i]=true;//先把所有猴子設置成存活
10         }
11         //3.定義變量保存猴子報的數
12         int num=0;
13         //4.定義變量保存剩餘的猴子數
14         int monkeyLeft=15;
15         //5.定義數組下標
16         int index=0;
17         //6.循環,直到只剩最後一隻猴子(猴子王)
18         while(monkeyLeft>1){//判斷條件
19             //7.檢測猴子是否已淘汰
20             if(b[index]){
21                 //8.報數
22                 num++;
23                 //9.判斷報數是否爲7
24                 if(num==7){
25                     b[index]=false;//爲7淘汰
26                     monkeyLeft--;//猴子數減一
27                     num=0;//報數歸零
28                 }
29 
30             }
31 
32             //10.下標移動
33             index++;
34             //11.圍成一圈---最後一個置爲0
35             if(index==15){
36                 index=0;
37             }
38         }
39 
40         //遍歷數組,找到最後活着的那個猴子王
41         for(int i=0;i<b.length;i++){
42             if(b[i]){
43                 System.out.println(i+1);
44             }
45         }
46     }
47 }

           輸出結果: 5

  2.5古典問題:生兔子問題

             有一對兔子,從出生後第3個月起都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月兔子的對數爲多少?

             程序分析:前兩個月兔子的對數爲1

             從第三個月開始,兔子的對數變成了 2 3 5 8 13 21 …

             示例代碼:

 1 public class GetRabbitNum {
 2     public static void main(String[] args) {
 3         System.out.println("請輸入要判斷的月數:");
 4         int month = new Scanner(System.in).nextInt();
 5         System.out.println("第"+month+"月兔子的對數爲:"+getSum(month));
 6     }
 7 
 8     public static int getSum(int month) {
 9         //如果是前兩個月,還是1對兔子
10         if(month == 1 || month == 2) {
11             return 1;
12         }else {
13             //從第三個開始,兔子按照2 3 5 8 13 21變化
14             return getSum(month-1)+getSum(month-2);
15         }
16     }

          請輸入要判斷的月數: 12

          第12月兔子的對數爲:144

 

  2.6打印水仙花數

 

  2.7迴文問題

 

  2.8二分法查找

 

  2.9完數問題

 

  2.10楊輝三角

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章