一、奇偶判断
思路:第一位是字母,其他位全是数字,我们利用char计算时使用的是 assic 码值,但 数字字符的acsic 码 的奇偶性是一样的!因此我们可以直接计算!
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] arr = sc.next().toCharArray();
System.out.print(arr[arr.length - 1] % 2);
}
}
二、字母补全
思路:如果我们在一段长度为26的区间里有重复元素,那么它一定不能拼出合法子串,所以当我们长度为26的区间内没有重复的字符,那它一定可以拼出合法子串,然后之后的子串按照原来的输出即可,'?' 字符输出任意字符即可
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
char[] arr = s.toCharArray();
Set<Character> set = new HashSet<>();
List<Character> list = new ArrayList<>();
for (int i = 25; i < s.length(); i ++) {
set.clear(); // set 记录长度为26的区间内是否有重复元素
boolean flag = true;
for (int j = i - 25; j <= i; j ++) {
if (s.charAt(j) == '?') continue;
if (set.contains(s.charAt(j))) {
flag = false;
break;
}
else set.add(s.charAt(j));
}
if (flag) { // 当我们确定没有重复元素的时候,我们需要枚举看那些元素是缺失的,把它补在?的位置
list.clear();
for (char c = 'A'; c <= 'Z'; c ++) {
if (!set.contains(c)) list.add(c);
}
int k = 0;
for (int j = i - 25; j <= i; j ++) {
if (s.charAt(j) == '?') arr[j] = list.get(k ++);
}
for (int j = 0; j < arr.length; j ++) {
if (arr[j] == '?') arr[j] = 'A';
}
System.out.print(new String(arr));
return;
}
}
System.out.print(-1);
}
}
三、整数分组
分类讨论:
假如我们的总数为1的个数是偶数,那我们两边均匀分配,一定有合法答案,剩余的总数不是1的个数分配到一边即可
假如我们的总数为1的个数不是偶数,那我们就在找有没有总数大于等于3的数,把它分成两份,多的一份给少的补上,两边的总和也是相等的
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Integer>[] list = new ArrayList[101];
for (int i = 0; i < 101; i ++) list[i] = new ArrayList<>();
for (int i = 0; i < n; i ++) {
int x = sc.nextInt();
list[x].add(i);
}
int cnt = 0;
for (int i = 0; i < 101; i ++) {
if (list[i].size() == 1) cnt ++;
}
char[] res = new char[n];// 先把数量为1的数均分了
for (int i = 0; i < n; i ++) res[i] = 'B';
for (int i = 0,k = 0; i < 101; i ++) {
if (list[i].size() == 1) {
k ++;
if (k <= cnt / 2) {
res[list[i].get(0)] = 'A';
}
}
}
boolean flag = true;
if (cnt % 2 != 0) { // 如果是奇数我们才有必要做剩下的
flag = false;
for (int i = 0; i < 101; i ++) {
if (list[i].size() > 2) {
flag = true;
res[list[i].get(0)] = 'A';
break;
}
}
}
if (flag) {
System.out.println("YES");
System.out.println(new String(res));
}
else System.out.println("NO");
}
}