• [每日两题系列]刷算法题咯~~


    今日题目

            本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
            话不多说, 直接开刷~~ 今日题目选自蓝桥杯中的两道题.

    卡片

            题目描述:
    在这里插入图片描述

    解题思路:
            (1) 这道题我们可以使用哈希的思想, 将每个数字一共有多少张卡片给记录下来. 接下来每当出现一个数字, 就将这个数字对应卡片的数量减1.
            (2) 从1开始拼, 所以我们可以先把要累加的值设为1, 接下来就分为两种思路: 一是对这个需要判断每一位的数字, 每次进行%10来拆分这个数字; 二是将这个数字转成一共字符串, 再将这个字符串拆分成一个字符数组, 然后遍历这个字符数组即可. 本人建议使用第二种方法, 好想也好写. char[] str = String.valueOf(number).toCharArray()

    实现代码:

    public class Main {
        public static void main(String[] args) {
            int[] numbers = new int[10];
            for(int i = 0; i < 10; i++){
                numbers[i] = 2021;
            }
            int number = 1;
            boolean flag = true;
            while(flag){
                //将整数先转字符串后再转字符数组
                char[] str = String.valueOf(number).toCharArray();
                for(int i = 0; i < str.length; i++){
                    if(numbers[str[i]-'0'] > 0){
                        numbers[str[i]-'0']--;
                    }else{
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    number++;
                }
            }
            System.out.println(number-1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    直线

            题目描述:
    在这里插入图片描述

    解题思路:
            (1) 这道题属于是数学题了, 写起来会比较复杂.
            (2) 我们可以先使用一个集合(这里用顺序表)来将平面 20X21 个整点给存储起来. 其中集合中的每个元素都是Map类型, 用来存储点的坐标(这样不会出现重复点的情况).
            (3) 接下来进行计算斜率k和系数b, 在此之前, 需要先从集合中获取两个点, 然后将这两个点计算出来的k和b通过Map存储到Set当中, 当出现与Set中相同的值的时候, 就不会进行存储.
            (4) 需要注意的是, 在(3)中我们是不考虑水平和垂直的直线, 因为在平面中是会包含很多两点连成同一条水平或垂直的直线, 将这些情况抛出出去最后再直接加上可以提高效率.

    实现代码:

    public class Main {
        public static void main(String[] args) {
            //存储所有的k和b
            Set<Map<Double, Double>> lines = new HashSet<>();
    
            //存储所有点的集合
            List<Map<Integer, Integer>> points=new ArrayList<>();
            for(int i = 0; i < 20; i++){
                for(int j = 0; j < 21; j++){
                    Map<Integer, Integer> temp = new HashMap<>();
                    temp.put(i, j);
                    points.add(temp);
                }
            }
    
            //计算斜率
            for(int i = 0; i < points.size(); i++){
                for(int j = i + 1; j < points.size(); j++){
                    //先获取两点的坐标
                    double x1 = 0;
                    double y1 = 0;
                    double x2 = 0;
                    double y2 = 0;
                    for(Map.Entry<Integer, Integer> entry : points.get(i).entrySet()){
                        x1 = entry.getKey();
                        y1 = entry.getValue();
                    }
                    for(Map.Entry<Integer, Integer> entry : points.get(j).entrySet()){
                        x2 = entry.getKey();
                        y2 = entry.getValue();
                    }
                    //先不考虑水平或者垂直的直线
                    if(x1 == x2 || y1 == y2){
                        continue;
                    }
                    //开始计算斜率
                    double k = (y2 - y1)/(x2 - x1);
                    double b = (x2*y1 - x1*y2)/(x2 - x1);
                    Map<Double, Double> temp = new HashMap<>();
                    temp.put(k, b);
                    lines.add(temp);
                }
            }
    
            System.out.println(lines.size() + 20 + 21);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    云计算认证哪个好?考什么内容?
    前端页面加载性能优化
    Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.5 Qemu实现RTC设备
    SwinTransformer学习记录(一)之整体架构
    一个项目设置两个Git地址,实现同时推送到两个Git仓库
    Android ViewModel与LiveData组件组合使用详解
    Python日期处理库:掌握时间的艺术
    第八章 设计zrlog项目接口自动化测试框架(8.5章节)
    C++ STL详解(六) ---------- set、map、multiset、multimap的介绍
    java集合之迭代器遍历元素
  • 原文地址:https://blog.csdn.net/Faith_cxz/article/details/126244441