java刷题-技能树蓝桥基础7-9

原题链接:(13条消息) 星系炸弹-蓝桥杯-基础-CSDN算法技能树

星系炸弹

题目

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

每个炸弹都可以设定多少天之后爆炸。

比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

问题分析

题意就是计算 给定日期1000天后对应的日历时间

  1. 考虑平年闰年情况

  1. 考虑包含多少闰年

可以使用数组方法计算,不过有点麻烦,但也是锻炼算法能力的过曾

可以使用data类Calendar进行快速日期计算

代码实现

data、Calendar日期函数方法

package 刷题;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class 星系炸弹 {

    public static void main(String[] args){
        // TODO Auto-generated method stub
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, 2014);
        c.set(Calendar.MONTH,10);
        c.set(Calendar.DAY_OF_MONTH,9);
        c.add(Calendar.DAY_OF_YEAR,1000);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = c.getTime();;
        System.out.println(simpleDateFormat.format(date));//2017-08-05


    }

}

输出结果如下

数组计算方法

理解了原本代码,其实补全和仿照写for循环很简单,这里是详细解读

下面是while循环的写法

public static void main(String[] args){
        // TODO Auto-generated method stub
        int year = 2014;
        int month = 11;
        int day = 9;
        int addday = 1000;
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        while(addday>365) {
            year++;
            if(year%4!=0) addday -= 365;
            else addday -= 366;
        } 
        while(addday>=days[month]){
            addday -= days[month];
            month++;
            if(month>12) {
                month -= 12;
                year++;
            }       
        }
        day += addday;
        if(day>=days[month]) {
            day -= days[month];
            month++;
        }
        if(month>12) {
            month -= 12;
            year++;
        }
        System.out.println(year+"-"+month+"-"+day);



    }

输出结果如图

特殊数的和

题目

题目描述

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 n 中,所有这样的数的和是多少?

输入格式

共一行,包含一个整数 n。

输出格式

共一行,包含一个整数,表示满足条件的数的和。

数据范围

1≤n≤10000

输入样例:

40

输出样例:

574

问题分析

实现该问题重点在于判断出哪个数包含特定数字,然后再进行累加就可以

  1. 可以使用字符串函数contains()包含函数检测

  1. 可以使用遍历方法

代码实现

package 刷题;

import java.util.Scanner;

public class 特别数字的和 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc  = new Scanner(System.in);
        int n=sc.nextInt();
        int sum = 0;2
        for (int i=1;i<=n;i++){
            String s = Integer.toString(i);
            if (s.contains("2")||s.contains("0")||s.contains("1")||s.contains("9")){
                sum+=i;
            }
        }
        System.out.println(sum);

    }

}

输入样例输入,得到正确结果

蛇形填数

题目

如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。

容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列的数是多少?

提示:

右上走

问题分析

1当到达边界时,判断它应该向右走还是向下走,向右走完就直接向左下走,向下走完就直接向右上走

(13条消息) 【蓝桥杯】蛇形填数 - Java版解析_猫巳的博客-CSDN博客_java蛇形填数

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
树上选点是蓝桥杯Java题目中的一种类型,通常需要在给定的树结构中选择一个或多个节点作为目标节点,并进行相应的操作。下面是一个简单的树上选点蓝桥Java题解的示例: 题目描述: 给定一棵有N个节点的树,每个节点上都有一个非负整数值。现在需要选择一些节点,使得选择的节点的值之和最大,且所选节点不能相邻(即选了一个节点,则其父节点和子节点都不能选)。请编写一个程序,计算出最大的节点值之和。 解题思路: 这是一个典型的动态规划问题。我们可以定义一个数组dp,其中dp[i]表示以第i个节点为根节点的子树中所选节点的最大值之和。对于每个节点i,有两种情况: 1. 选择节点i:则其子节点都不能选,所以dp[i] = val[i] + dp[grandchild1] + dp[grandchild2] + ... 2. 不选择节点i:则其子节点可以选择或不选择,所以dp[i] = max(dp[child1], dp[child2], ...) 根据以上思路,我们可以使用递归或者迭代的方式来计算dp数组。最终,所求的最大值即为dp,其中1表示根节点。 代码示例: ```java public class TreeSelectPoint { public static void main(String[] args) { int[] values = {0, 1, 2, 3, 4, 5}; // 节点值数组,下标从1开始 int[][] edges = {{1, 2}, {1, 3}, {2, 4}, {2, 5}}; // 树的边关系数组 int n = values.length - 1; // 节点个数 int[] dp = new int[n + 1]; // 动态规划数组 // 构建树的邻接表 List<List<Integer>> adjacencyList = new ArrayList<>(); for (int i = 0; i <= n; i++) { adjacencyList.add(new ArrayList<>()); } for (int[] edge : edges) { int u = edge[0]; int v = edge[1]; adjacencyList.get(u).add(v); adjacencyList.get(v).add(u); } dfs(1, -1, values, adjacencyList, dp); // 从根节点开始进行深度优先搜索 System.out.println(dp[1]); // 输出最大节点值之和 } private static void dfs(int cur, int parent, int[] values, List<List<Integer>> adjacencyList, int[] dp) { dp[cur] = values[cur]; // 初始化当前节点的dp值为节点值 for (int child : adjacencyList.get(cur)) { if (child != parent) { // 避免重复访问父节点 dfs(child, cur, values, adjacencyList, dp); dp[cur] += dp[child]; // 更新当前节点的dp值 } } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CLODVEP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值