java算法3個題:1、 跳臺階,2、 在二進制數中計算1的個數,3、 在十進制數中計算1的個數。

一些小的算法,都是java版的,網絡上大量的題都是針對C++的,因此java的實現很少,但是都是考的基礎,

 

實現都是一樣,可以開闊一下思路,有益無敝。

 

/**
 *  1 跳臺階問題
 *    題目:一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。
 *    求總共有多少總跳法,並分析算法的時間複雜度。
 * 是一個組合題, 完全正確很難,
 * 總共有m臺階 n爲2個臺階
 * O( ( m - n) * (2n - 1)) )
 */
public class JumpFootstep {

    public static void main(String[] args) {
        jumpStepWay(10);
    }

    private static void jumpStepWay(int n) {
        int twoStep = 1;
        while (2 * twoStep <= n) {
            printLeftJoin(twoStep, n);
            for (int i = 1; i <= twoStep; i++) {
                int oneStep = n - 2 * twoStep;
                List<Integer> ls = new ArrayList<Integer>();

                for (int j = 1; j <= oneStep; j++) {
                    for (int k = 0; k < (twoStep - i); k++) {
                        ls.add(2);
                    }
                    for (int m = 0; m < j; m++) {
                        ls.add(1);
                    }
                    for (int m = 0; m < i; m++) {
                        ls.add(2);
                    }
                    for (int m = 0; m < oneStep - j; m++) {
                        ls.add(1);
                    }
                    print(ls);
                    ls.clear();
                }
                if (i != twoStep) {
                    for (int j = 1; j <= oneStep; j++) {
                       
                        for (int m = 0; m < j; m++) {
                            ls.add(1);
                        }
                        for (int m = 0; m < i; m++) {
                            ls.add(2);
                        }
                        for (int m = 0; m < oneStep - j; m++) {
                            ls.add(1);
                        }
                        for (int k = 0; k < (twoStep - i); k++) {
                            ls.add(2);
                        }
                       
                        print(ls);
                        ls.clear();
                    }
                }

            }
            twoStep++;
        }
    }
    private static void printLeftJoin(int twoStep, int n){
        for (int i = 1; i <= twoStep; i++) {
            System.out.print(2);
        }
        for (int i = 1; i <= n - 2 * twoStep; i++) {
            System.out.print(1);
        }
        System.out.println();
    }
    private static void print(List<Integer> ls ){
        for (int m = 0; m < ls.size(); m++) {
            System.out.print(ls.get(m));
        }
        System.out.println();
    }
}

 

跳臺階的答案中有重複的輸出,是一個待解決之問題!

 

/**
 * 2 整數的二進制表示中1的個數
 * 題目:輸入一個整數,求該整數的二進制表達中有多少個1。
 * 例如輸入10,由於其二進制表示爲1010,有兩個1,因此輸出2。
 *
 * @author wangjichen
 *
 */
public class BinaryOneCount {

    public static void main(String[] args) {
       
        long b = 1101;
        long i = 1;
        int count = 0;
        int time = 0;
        while (i > 0) {
            long f = i & b;
            f >>= time;
            if (f == 1) {
                count++;
            }
            i <<= 1;
            time++;
        }
        System.out.println(count);
    }
}

 

千萬不能把b的值向右移動,來和i=1相比較,會出現死循環,想一想爲什麼吧。。。

/**
 * 3 在從1到n的正數中1出現的次數
 * 題目:輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。
 * 例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。 分析:這是一道廣爲流傳的google面試題。
 *
 * @author wangjichen
 *
 */
public class DecimalOneCount {

    public static void main(String[] args){
        judge(111);
    }
   
    private static void judge(int n){
        int result = 0;
        for(int i = n; i >= 0; i --){
            result += eachJudge(i);
        }
        System.out.println(result);
    }
    private static int eachJudge(int n){
        int count = 0;
        while(n > 0){
            int f = n % 10;
            if(f == 1){
                count ++;
            }
            n /= 10;
        }
        return count;
    }
}

 

第二道題的答案是,當b爲負數時,就是死循環了。

 

不知道考官是不是想考這個,不過大體思路大家都會,估計左右移動的方向就是招人的分界線了。

 

謹慎是金哪!

發佈了36 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章