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

今日题目

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

卡片

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

解题思路:
        (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) 我们可以先使用一个集合(这里用顺序表)来将平面 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值