资讯专栏INFORMATION COLUMN

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

jayce / 836人阅读

摘要:计划的主要内容数据结构和算法的基础知识巩固。逐步进阶的算法训练。计划的时间安排每周三和周六说在前面算法每日学计划打卡问题描述对于长度为位的一个串,每一位都可能是或,一共有种可能。

自己一直在思考,怎么把算法的训练做好,因为个人在算法这方面的掌握确实还不够。因此,我现在想做一个“365算法每日学计划”。

“计划”的主要目的:

1、想通过这样的方式监督自己更努力的学习算法。

2、想和小伙伴们“组团”一起来学习交流学习算法过程中的点点滴滴。

“计划”的主要内容:

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

2、逐步进阶的oj算法训练。

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

——说在前面

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

00000

00001

00010

00011

00100

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

输入格式

本试题没有输入。

输出格式

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

样例输出

00000

00001

00010

00011

<以下部分省略>

解题思路与实现

如果有小伙伴很少接触到这种题目的话,可能会觉得有点陌生,不知道从何下手,可能一开始我们能想到“最笨”的方法,但是也觉得挺有“娱乐性”的方法。

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

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

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

这种方式是不是能够更加灵活的解决这个问题,这个解决的方式就是我们常说的“暴力破解”,全部用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的方法来解决:

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

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

文章有不当之处,欢迎指正,你也可以关注我的微信公众号:好好学java,获取优质学习资源。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69632.html

相关文章

  • 365算法每日计划”:03打卡-贪心算法

    摘要:贪心算法一基本概念所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。实际上,贪心算法适用的情况很少。值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。 自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够。因此,我现在想做一个365算法每日学计划。 计划的主要目的: 1、想通过这...

    isaced 评论0 收藏0
  • Tornado数据分析及数据可视化(一)

    摘要:仅值班时间及前后半个小时内打卡有效。上班下班均须打卡,缺打卡则视为未值班。分析表格我的指纹考勤机可以一次导出最多一个月的打卡记录。有一个问题是,这一个月可能横跨两个月,也可能横跨一年。分析当月当年的考勤记录同理,不过可能稍微复杂一些。 前面的话 今天公司突然有个紧急任务是读取excel表格,然后清洗并展示里面的数据。 分配给我的任务是!!! 写网页前端表单=。= 妈蛋,可是我很想...

    Simon 评论0 收藏0
  • 【万人千题】大算法社区火爆开启,每日打卡习,诚邀妳的加入

    摘要:三结对编程排位赛四个人为一组,由队长带队刷题,每周根据这周四个人的刷题总数进行队伍间排名。万人千题结对编程排位赛如果想参加的第二期的同学,可以先联系作者加群,看看第一期的同袍是如何奋斗的。 ...

    morgan 评论0 收藏0

发表评论

0条评论

jayce

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<