华为OD刷题C卷 - 每日刷题 18(一个字符串来表示员工的出勤信息,字符串变换最小字符串)

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

1、(考勤信息):

这段代码是解决“考勤信息”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个辅助方法isAward,用于判断员工是否能获得出勤奖。

main方法首先读取考勤记录的条数n,然后读取每个员工的考勤记录并存储到二维数组records中。接着,调用getResult方法并打印所有员工是否能获得出勤奖的结果。

getResult方法遍历所有员工的考勤记录,并调用isAward方法来判断每个员工是否能获得出勤奖,最后使用StringJoiner将所有结果拼接成一个字符串并返回。

isAward方法首先初始化缺勤次数absent和正常上班次数present。然后,遍历员工的考勤记录,检查是否违反了获得出勤奖的条件,包括:缺勤不超过一次、没有连续的迟到/早退、任意连续7次考勤中缺勤/迟到/早退不超过3次。如果违反了任何条件,返回false;如果遍历结束后都没有违反条件,返回true

2、(字符串变换最小字符串):

这段代码是解决“字符串变换最小字符串”的问题。它提供了一个Java类Main,其中包含main方法和transform方法,用于通过一次变换得到给定字符串的最小字典序字符串。

main方法读取输入的字符串s,然后调用transform方法并打印变换后的字符串。

transform方法首先将字符串s转换为字符数组并对其进行排序,得到最小字典序的字符串minStr。如果s已经等于minStr,则不需要变换,直接返回s。否则,遍历字符串s,找到第一个与minStr不同的字符,并将其与s中该字符最后一次出现的位置上的字符进行交换。这样,只进行一次变换,就能得到变换后能得到的最小字符串。

package OD266;

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

/**
 * @description 考勤信息
 * @level 6
 * @score 100
 */

/**
 * 题目描述
 * 公司用一个字符串来表示员工的出勤信息
 * <p>
 * absent:缺勤
 * late:迟到
 * leaveearly:早退
 * present:正常上班
 * 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
 * <p>
 * 缺勤不超过一次;
 * 没有连续的迟到/早退;
 * 任意连续7次考勤,缺勤/迟到/早退不超过3次。
 * 输入描述
 * 用户的考勤数据字符串
 * <p>
 * 记录条数 >= 1;
 * 输入字符串长度 < 10000;
 * 不存在非法输入;
 * 输出描述
 * 根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”。
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //不存在非法输入
        //考勤条数
        int n = Integer.parseInt(sc.nextLine());
        //考勤记录
        String[][] records = new String[n][];
        for (int i = 0; i < n; i++) {
            records[i] = sc.nextLine().split(" ");
        }
        System.out.println(getResult(records));
    }

    //统计所有行的结果
    public static String getResult(String[][] records) {
        StringJoiner sj = new StringJoiner(" ");
        for (int i = 0; i < records.length; i++) {
            sj.add(isAward(records[i]) + "");
        }
        return sj.toString();
    }


    //判断该行记录是否能得到全勤奖
    public static boolean isAward(String[] records) {
        int absent = 0;//缺勤
        int present = 0;
        String lastRecord = "";
        for (int i = 0; i < records.length; i++) {
            //如果大于7了,要移出左边那个窗口,只影响present数量
            if (i >= 7) {
                //防止空指针异常:常量放前面
                if ("present".equals(records[i - 7])) {
                    present--;
                }
            }
            //当前的考勤记录
            String temp = records[i];
            switch (temp) {
                case "absent":
                    if (++absent > 1) {
                        return false;
                    }
                    //break很重要,不然会进入到下一个case,给present++
                    break;
                case "present":
                    present++;
                    break;
                case "late":
                case "leaveearly":
                    //如果上一个也是迟到早退,则返回false
                    if ("leaveearly".equals(lastRecord) || "late".equals(lastRecord)) {
                        return false;
                    }
                    break;
            }
            //刷新上一个记录
            lastRecord = temp;
            //当前窗口长度
            int windowLength = Math.min(i + 1, 7);
            //如果当前窗口内迟到、早退、缺席>3,则返回false
            if (windowLength - present > 3) {
                return false;
            }
        }
        //上面都没有返回false,则可以拿全勤
        return true;
    }
}
package OD268;

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

/**
 * @description 字符串变换最小字符串
 * @level 6
 */

/**
 * 题目描述
 * 给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
 * <p>
 * 变换规则:交换字符串中任意两个不同位置的字符。
 * <p>
 * 输入描述
 * 一串小写字母组成的字符串s
 * <p>
 * 输出描述
 * 一串小写字母组成的字符串s
 * <p>
 * 备注
 * s是都是小写字符组成
 * 1 ≤ s.length ≤ 1000
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(transform(sc.next()));
    }

    //做一次变换,返回变换后的字符串
    public static String transform(String s) {
        char[] minStr = s.toCharArray();
        Arrays.sort(minStr);

        String temp = new String(minStr);
        if (temp.equals(s)) {
            //自身就是最小值
            return s;
        }
        //如 afcbbb 变换为 abcbbf 把第一个跟minStr出现的不同字符变换到最后一个出现b的index处
        char[] result = s.toCharArray();

        for (int i = 0; i < s.length(); i++) {
            if (result[i] != minStr[i]) {
                //把第一个非最小排序的值暂存
                char tempChar = result[i];
                //把该位置变为排序后最小时对应的值
                result[i] = minStr[i];
                //找到该值出现在原字符串中的最后索引
                int index = s.lastIndexOf(minStr[i]);
                //把temp交换到该值最后出现的位置上
                result[index] = tempChar;
                //交换一次就跳出
                break;
            }
        }
        return new String(result);

    }
}
  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值