“365算法每日学计划”:01打卡

image

本身一直在思考,怎么把算法的训练作好,由于我的在算法这方面的掌握确实还不够。所以,我如今想作一个“365算法每日学计划”。

“计划”的主要目的:java

一、想经过这样的方式监督本身更努力的学习算法。算法

二、想和小伙伴们“组团”一块儿来学习交流学习算法过程当中的点点滴滴。微信

“计划”的主要内容:数据结构

一、数据结构和算法的基础知识巩固。数据结构和算法

二、逐步进阶的oj算法训练。学习

“计划”的时间安排:每周三和周六spa

——说在前面code

“算法每日学”计划01打卡:
问题描述
对于长度为5位的一个01串,每一位均可能是0或1,一共有32种可能。它们的前几个是:资源

00000rem

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

输入格式

本试题没有输入。

输出格式

输出32行,按从小到大的顺序每行一个长度为5的01串。

样例输出

00000

00001

00010

00011

<如下部分省略>

解题思路与实现

若是有小伙伴不多接触到这种题目的话,可能会以为有点陌生,不知道从何下手,可能一开始咱们能想到“最笨”的方法,可是也以为挺有“娱乐性”的方法。

System.out.println("00000")
..........
System.out.println("11111")

这种方式是否是也可以获得最后的结果,没错,固然没问题,可是,咱们在思考的时候能够一步一步来,尝试多种方法,找到最优解。

这种方法看来不太好,一是不够灵活,二是敲代码很累,因此,改进一下。

image

这种方式是否是可以更加灵活的解决这个问题,这个解决的方式就是咱们常说的“暴力破解”,所有用for循环来遍历全部的状况,若是找到符合的状况就输出,可是咱们会发现,这个算法的时间复杂度是:O(n^5),这个方法比前一种方法更好了,可是还不是最好的答案。

public static void main(String[] args) {
        for (int i = 0; i < 32; i++) {
            String result = Integer.toBinaryString(i);
            int num = result.length();
                for (int j = 0; j < 5 - num; j++) {
                    result = "0" + result;
                }
                System.out.println(result);

    }

}

再来看看这种方法,这种方法的思路:经过jdk的方法Integer.toBinaryString()获取到每一个数字的二进制,由于要求输出的是形如“11111”的五位数字,因此,咱们还须要根据获得的二进制的数字的长度,在这个字符串的前面加上5 - num“0”,好比,获得的二进制是1(长度为1),因此在1的前面要加上5-(num=1)等于4个0

是否是特别的简洁,并且这种方法的效率应该也是不错的:O(n),由于这个是jdk提供的方法,在底层是用位移的方法来实现的(注:咱们不推荐用jdk的方法来解决,咱们尽可能用本身思考的方法来解决,就算这个方法“笨”,可是也是本身思考了)。

固然,若是咱们换个角度,也能够的到另外一种解法。

public static void main(String args[]){ 
        for(int i=0;i<32;i++){ 
            String str = Integer.toBinaryString(i); 
            switch (str.length()) { 
            case 1: 
                str = "0000"+str; 
                break; 
            case 2: 
                str = "000"+str;
                break;
            case 3:
                str = "00"+str;
                break;
            case 4:
                str = "0"+str;
                break;
            }
                System.out.println(str);

        }
    }
}

这种解法只是用switch-case的方式来解决而已,思路和上面同样。

最后再来一种不用jdk的方法来解决:

这种方法的思路先不提供,留给小伙伴们本身思考,若是小伙伴有本身的想法,欢迎小伙伴们在留言区给出你的想法或者解法。

另外,还建立了一个“算法每日学交流社区”,若是有想加入的小伙伴,能够扫一下下面的二维码加我为好友,我拉你入群(注:以上的有几种算法来自“算法每日学交流社区”的小伙伴们)。

image

文章有不当之处,欢迎指正,你也能够关注个人微信公众号: 好好学java,获取优质学习资源。
相关文章
相关标签/搜索