华为OD刷题C卷 - 每日刷题 24(最富裕的小家庭,最长子字符串的长度)

73 篇文章 0 订阅
37 篇文章 1 订阅

1、(最富裕的小家庭):

这段代码是解决“最富裕的小家庭”的问题。它提供了一个Java类Main,其中包含main方法,用于计算给定家庭成员关系和财富值的情况下,最富裕的小家庭的财富和。

main方法首先读取成员总数n,然后读取每个成员的财富值并存储在数组wealth中。同时,使用数组familyWealth来存储每个成员及其直接子节点的财富总和。通过遍历输入的家庭成员关系,将子节点的财富值累加到其父节点的familyWealth中。

最后,使用Arrays.streammax方法找出familyWealth数组中的最大值,并打印出来。

2、(最长子字符串的长度):

这段代码是解决“最长子字符串的长度(一)”的问题。它提供了一个Java类Main,其中包含main方法和getMaxString方法,用于找出环形字符串中’o’字符出现次数为偶数的最长子字符串的长度。

main方法首先读取输入的字符串s,然后调用getMaxString方法并打印结果。

getMaxString方法首先统计字符串中’o’字符的个数。如果’o’的个数为偶数,则直接返回字符串的长度n,因为整个字符串满足条件。如果’o’的个数为奇数,则返回n - 1,因为在环形字符串中去掉一个’o’可以使剩余部分的’o’个数为偶数,从而得到最长的满足条件的子字符串。

package OD342;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @description 最富裕的小家庭
 * @level 6
 * @type 逻辑分析
 */

/**
 * 题目描述
 * <p>
 * 在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。
 * 现给你一颗树,请计算出最富裕的小家庭的财富和。
 * <p>
 * 输入描述
 * <p>
 * 第一行为一个数 N,表示成员总数,成员编号 1~N。1 ≤ N ≤ 1000
 * 第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000
 * 接下来 N -1 行,每行两个空格分隔的整数(N1, N2),表示 N1 是 N2 的父节点。
 * <p>
 * 输出描述
 * <p>
 * 最富裕的小家庭的财富和
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            //成员个数
            int n = sc.nextInt();
            //成员财富,从1开始
            int[] wealth = new int[n + 1];
            //该成员的家庭财富:自身+子节点
            int[] familyWealth = new int[n + 1];
            for (int i = 1; i <= n; i++) {
                wealth[i] = sc.nextInt();
                //初始化家庭财富
                familyWealth[i] = wealth[i];
            }
            //依次读取成员关系,并直接将对应子节点的值加到其对应的父节点的famliyWealth中
            for (int i = 0; i < n - 1; i++) {
                int parent = sc.nextInt();
                int child = sc.nextInt();
                familyWealth[parent] += wealth[child];
            }
            //遍历找到最大的familyWealth
            int max = Arrays.stream(familyWealth).max().orElse(0);

            System.out.println(max);
        }
        sc.close();
    }
}
package OD343;

import java.util.Scanner;

/**
 * @description 最长子字符串的长度(一)
 * @level 6
 * @type 逻辑分析
 */

/**
 * 题目描述
 * 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 'o' 字符出现了偶数次最长子字符串的长度。
 * <p>
 * 输入描述
 * 输入是一个小写字母组成的字符串
 * <p>
 * 输出描述
 * 输出是一个整数
 * <p>
 * 备注
 * 1 ≤ s.length ≤ 500000
 * s 只包含小写英文字母
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 读入数据
        String s = sc.next();
        System.out.println(getMaxString(s));
    }

    /**
     * 返回字符串中包含偶数个o的最长子字符串的长度
     * @create 2024/3/16 17:31
     * @param s
     * @return int
     */
    public static int getMaxString(String s) {
        // 字符串长度
        int n = s.length();
        // 统计字符串中'o'的个数
        int count = 0;
        //遍历字符,统计o的个数
        for(int i = 0; i < n; i++){
            if(s.charAt(i) == 'o'){
                count++;
            }
        }
        //如果是偶数,则本身就是最大
        if(count % 2 == 0){
            return n;
        }else {
            return n - 1;
        }
    }
}
  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值