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);
}
}