“365算法每日学计划”:java语言基础题目及解答(01-05打卡)

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

“算法每日学”计划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}

“算法每日学”计划02打卡: 问题描述   十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。   给出一个非负整数,将它表示成十六进制的形式。 输入格式   输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647 输出格式   输出这个整数的16进制表示 样例输入 30 样例输出 1E

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Integer n = in.nextInt();
        in.close();
        System.out.println(Integer.toHexString(n).toUpperCase());
    }
}

上面是api,下面看看其他:

这道题本身是没什么难度的,只要用递归处理,当输入的数字大于等于16时,则递归处理该数整除16的值,然后再输出最后一位即可。

但是,我在做的时候,一开始没有考虑到整除16后的值大于9的情况和整除16的次数大于9的情况,结,如下图这里写图片描述

以后要注意考虑全方面和一定要注意数据范围!

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int[] b=new int[8];            
//数组b的元素个数由a决定,由于a<=2^32,即a<=16^8
        char[] s={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        if(a>=0&&a<16){
            for(int i=0;i<16;i++){

                int m=a%16;
                if(m==i)
                        System.out.println(s[i]);
                    }
            }
        else{
            int i=0;
            while(a!=0){
                b[i]=a%16;
            a=a/16;
                i++;
            }

        for(int j=i-1;j>=0;j--){
            if(b[j]==10)
                System.out.print("A");
            else if(b[j]==11)
                System.out.print("B");
            else if(b[j]==12)
                System.out.print("C");
            else if(b[j]==13)
                System.out.print("D");
            else if(b[j]==14)
                System.out.print("E");
            else if(b[j]==15)
                System.out.print("F");
            else
                System.out.print(b[j]);
        }
        }
        }
}

“算法每日学”计划03打卡: 问题描述   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。   例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 输入格式   每个测试案例包括2行:   第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。   第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。 输出格式   对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。 样例输入 9 1 2 3 2 2 2 5 4 2 9 1 1 1 2 2 2 3 3 3 样例输出 2 -1

    /**
     * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
     * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
     * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
     */
    public int findMoreThanHalfNum(int[] numbers) {
        int length = numbers.length;
        if (length == 0) return 0;

        int num = numbers[0], count = 1;
        for (int i = 1; i < length; i++) {
            if (numbers[i] == num) count++;
            else count--;
            if (count == 0) {
                num = numbers[i];
                count = 1;
            }
        }
        // Verifying
        count = 0;
        for (int i = 0; i < length; i++) {
            if (numbers[i] == num) count++;
        }
        if (count * 2 > length) return num;
        return 0;
    }

“算法每日学”计划04打卡: 问题描述     在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。   请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 输入  输入可能包含多个测试样例,对于每个测试案例,   输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。   输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。   接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 输出 对应每个测试案例,   输出”Yes”代表在二维数组中找到了数字t。   输出”No”代表在二维数组中没有找到数字t。 样例输入 3 3 5 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 样例输出 YES NO

public class Main {
       public boolean Find(int target, int [][] array) {
       int rowCount = array.length;//获取数据的行数
       int colCount = array[0].length; //获取数据的列数
       int i,j;
       i=rowCount-1;
       j=0;

      while((i >=0 )&&(j<colCount)) {
           if (target == array[i][j]) {
                    return true;    
                    }
           else if (target<array[i][j]) {
                i--;
           }else {
               j++;
           } 
       }       
        return false;   
       }
}

“算法每日学”计划05打卡: 问题描述     理论知识学习,算法基础,理解时间复杂度,理解空间复杂度。 输入  无 输出 无

参考答案:https://blog.csdn.net/halotrriger/article/details/78994122

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏take time, save time

20分钟脱离搜索引擎构建正则表达式

正则表达式,在现代语言中可以说无处不在。而正则表达式的构成往往伴随着好多符号,我经常会看到别人在搜索引擎和代码界面来回切换以求能构成一个靠谱的正则表达式。我写这...

841
来自专栏码洞

天下无难试之HashMap面试刁难大全

HashMap的结构无疑是Java面试中出现频率最高的一道题,这个题是如此之常见,应该每个人都会信手拈来。可是就在我经历过的无数【允许我夸张一下】面试当中,能完...

992
来自专栏从流域到海域

《笨办法学Python》 第35课手记

《笨办法学Python》 第35课手记 本节课讲函数和分支的,实际上是一次综合练习,代码有点长,请先纠正代码中的错误使脚本能够运行。 原代码中使用三个空格来进行...

20810
来自专栏小樱的经验随笔

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号。要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出...

2664
来自专栏小詹同学

【记录帖】(No.001)从零打卡刷Leetcode

小詹一直觉得自己编程能力不强,想在网上刷题,又怕不能坚持。不知道有木有和小伙伴和小詹一样想找个人一起刷题呢?欢迎和小詹一起定期刷leetcode,每周一周五更新...

1173
来自专栏AI科技大本营的专栏

送书 | 跟我一起学《流畅的Python》

本文引自图灵新书《流畅的Python》的第一章——Python数据模型。本书由奋战在Python开发一线近20年的Luciano Ramalho执笔,Victo...

3834
来自专栏take time, save time

你所能用到的数据结构(八)

十一、不能被应用的理论不是好研究 前面介绍了堆栈的一些小小的理论模型,那么这样一个东西有什么作用呢?实际中不可能有那么一辆停在站台前方堵死的火车的,即使有,也...

2704
来自专栏owent

不知道是哪一年的腾讯马拉松题目 照片评级 解题报告

结果就一不小心看到了这个充满回忆的ACM模式竞赛,还有咱腾讯的,就忍不住看了一下。

611
来自专栏编程

Python利器之迭代器

各位小伙伴们 大家周四愉快 今天要和大家探讨一个 Python的特色功能 也是Python有别于其他变成语言的 强大利器 迭代器 迭代这一个词可能有的小伙伴不理...

1907
来自专栏西枫里博客

Python学习笔记十一(递归)

本次学习先回顾了前两天的lambda表达式,使用lambda表达式创建匿名函数。接着学习本次课程的内容:Python的递归。什么是递归,程序调用自身的编程方法叫...

722

扫码关注云+社区