Leetcode - 周赛445

一、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,说明当前可以选择字符 a
  • p < k,说明当前不能选择字符 a,继续枚举字符

本题的难点在于计算 ( n m ) \binom{n}{m} (m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶祇秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值