一、3516. 找到最近的人
题目链接
纯模拟,代码如下:
class Solution {
public int findClosest(int x, int y, int z) {
int a = Math.abs(x-z);
int b = Math.abs(y-z);
return a == b ? 0 : a > b ? 2 : 1;
}
}
二、3517. 最小回文排列 I
题目链接
本题求字典序最小的回文字符串,由于回文串是对称的,所以只需要考虑前半段就行,统计所有字符的出现次数,将其全部除以2(如果它的模是奇数,说明它有一个需要放在中间位置,额外记录一下),然后依次遍历a->z
,将字符填入到前半段回文串中就行。
代码如下:
class Solution {
public String smallestPalindrome(String s) {
int n = s.length();
int[] cnt = new int[26];
int idx = -1;// 记录奇数回文串中间的值
for(char c : s.toCharArray()){
cnt[c-'a']++;
}
for(int i = 0; i < 26; i++){
if(cnt[i] % 2 == 1){
idx = i;
}
cnt[i] /= 2;
}
char[] ans = new char[n];
int j = 0;
for(int i = 0; i < 26; i++){
while(cnt[i]-- > 0){
ans[j] = ans[n-1-j] = (char)(i + 'a');
j++;
}
}
if(idx != -1) ans[j] = (char)(idx + 'a');
return new String(ans);
}
}
三、3518. 最小回文排列 II
题目链接
与T2类似,只不过多了一个限制条件 k,可以使用试填法,枚举每一位可以选择的字符,计算如果当前选择字符 a,出现的所有排列 p,与 k 进行比较:
p >= k
,说明当前可以选择字符 ap < k
,说明当前不能选择字符 a,继续枚举字符
本题的难点在于计算 ( n m ) \binom{n}{m} (m