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

自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够。因此,我现在想做一个“365算法每日学计划”。

“计划”的主要目的:

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

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

“计划”的主要内容:

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

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

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

——说在前面

365算法每日学计划

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

问题描述 

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

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

输入格式 

本试题没有输入。 

输出格式 

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

样例输出 

00000 

00001 

00010 

00011 

<以下部分省略>

解题思路与实现

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

1System.out.println("00000")
2..........
3System.out.println("11111")

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

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

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

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

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

是不是特别的简洁,而且这种方法的效率应该也是不错的:O(n),因为这个是jdk提供的方法,在底层是用位移的方法来实现的(注:我们不推荐用jdk的方法来解决,我们尽量用自己思考的方法来解决,就算这个方法“笨”,但是也是自己思考了)。

当然,如果我们换个角度,也可以的到另一种解法。

 1public static void main(String args[]){
 2        for(int i=0;i<32;i++){
 3            String str = Integer.toBinaryString(i);
 4            switch (str.length()) {
 5            case 1:
 6                str = "0000"+str;
 7                break;
 8            case 2:
 9                str = "000"+str;
10                break;
11            case 3:
12                str = "00"+str;
13                break;
14            case 4:
15                str = "0"+str;
16                break;
17            }
18                System.out.println(str);

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

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

 1package sihai;
 2public class Test {
 3    public static void main(String[] args) {
 4        for(int i=0; i<32; ++i)  
 5        {  
 6            int a[] = new int[5];  
 7            int temp = i;  
 8            int index = 4;  
 9            while (temp >= 1)  
10            {  
11                a[index--] = temp % 2;  
12                temp = temp/2;  
13            }  
14            for (int idx = 0; idx < 5; ++idx)  
15            {  
16                System.out.print(a[idx]);  
17            }  
18            System.out.println();
19        }  
20    }
21}

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

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

坚持学一年很难,那坚持一周怎么样?[先行者课程-时间倒数-Data对象]

时间是线性的,所以依附于时间的事情也是线性发展的。例如学js,谁能一下学成高手?谁有js学习秘籍?高手只能跟你装b,却不能带你起飞。 这世界我看只有砖与狗粮是真...

2139
来自专栏老九学堂

程序员揭秘:火爆朋友圈的左右脑年龄测试,真相只是一个随机函数!

最近,老九的朋友圈已经被左右脑测试刷爆了,老九也去测试了一下,只需要进入相应入口并回答几个设定的问题后,就会出现左右脑两个年龄测试结果。 ? 有不少小伙伴晒出自...

3876
来自专栏数据结构与算法

2017 五一 清北学堂 Day1模拟考试结题报告

预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包...

3505
来自专栏数据小魔方

空间数据可视化与simple future模型应用

这是一篇关于关于空间地理信息数据可视化与simple feature 模型应用的笔记小结。

1543
来自专栏阿凯的Excel

乘积求和及符合某个条件的乘积求和

如何得到两个数组的乘积求和呢??案例如下: ? 已知每个地市的销售单价和销售数量,需要知道整个表的销售总金额,怎么做??? 普通青年做法: ? 小编客观公正...

4459
来自专栏数据派THU

一文读懂PyTorch张量基础(附代码)

本文介绍了PyTorch Tensor最基础的知识以及如何跟Numpy的ndarray互相转换。

1103
来自专栏杨光的专栏

千亿关系链下的新增共同好友计算

本文介绍一种千亿关系链下的日新增共同好友挖掘算法 --NTE 算法。该算法基于分治的思想,将新增共好友计算问题,转换为更易于运算与实现的三角形计算问题。

1K0
来自专栏racaljk

当我们谈论计算机科学

下午偶有所悟,特作此文防止青年痴呆。 这学期的学习算是走了一半计算机科学概论。广度的学习通常会被指责为广而不精,但对我而言这是毫无意义的,因为 ...

1064
来自专栏人工智能LeadAI

讨厌算法的程序员 | 第四章 时间复杂度

增长量级 ? 函数的增长量级 上一篇算法分析基础中,我们分析了插入排序,知道了其最好情况下的运行时间为T(n) = an + b,最差情况下的运行时间为T(n...

2938
来自专栏算法channel

动态规划中篇:爬楼梯

主要推送关于对算法的思考以及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。 0...

4139

扫码关注云+社区

领取腾讯云代金券