【LeetCode周赛】第 361 场周赛

统计对称整数的数目 简单

给你两个正整数 lowhigh

对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字之和相等,则认为这个数字是一个对称整数。

返回在 [low, high] 范围内的 对称整数的数目 。

示例 1

输入:low = 1, high = 100
输出:9
解释:在 1 到 100 范围内共有 9 个对称整数:11、22、33、44、55、66、77、88 和 99 。

示例 2

输入:low = 1200, high = 1230
输出:4
解释:在 1200 到 1230 范围内共有 4 个对称整数:1203、1212、1221 和 1230 。

提示

  • 1 <= low <= high <= 10^4

分析: 只需要考虑数字位数为偶数的数,遍历之后模拟一下就可以了。

代码:

class Solution {
public:
    int countSymmetricIntegers(int low, int high) {
        int a=0,b=0,ans=0;
        for(int i=low;i<=high;i++){
            if(!( (10<=i&&i<=99) || (1000<=i&&i<=9999) )) continue;
            int l=0,ans_a=0,ans_b=0,j=i;
            vector<int> v;
            while(j){
                v.push_back(j%10);
                j/=10;
                l++;
            }
            for(int p=0;p<l;p++){
                if(p<l/2) ans_a+=v[p];
                else ans_b+=v[p];
            }
            if(ans_a==ans_b) ans++;
        }
        return ans;
    }
};


生成特殊数字的最少操作 中等

给你一个下标从 0 开始的字符串 num ,表示一个非负整数。

在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。

返回最少需要多少次操作可以使 num 变成特殊数字。

如果整数 x 能被 25 整除,则该整数 x 被认为是特殊数字。

示例 1:

输入:num = “2245047”
输出:2
解释:删除数字 num[5] 和 num[6] ,得到数字 “22450” ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 2 位数字。

示例 2:

输入:num = “2908305”
输出:3
解释:删除 num[3]、num[4] 和 num[6] ,得到数字 “2900” ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 3 位数字。

示例 3:

输入:num = “10”
输出:1
解释:删除 num[0] ,得到数字 “0” ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 1 位数字。

提示

  • 1 <= num.length <= 100
  • num 仅由数字 '0''9' 组成
  • num 不含任何前导零

分析: 能被25整除的数,最后两位数只有以下四种可能:00255075。因此想要得到特殊数字,方案即为:将最后两位数变成以上四种可能的某一种(如果能得到多个方案,选择操作步骤最少的)。
如果不能得到以上结果,则判断是否含0。如果包含0,则删除除0外的所有数(即数字位数-1);如果不包含,则全部删除。

代码:

class Solution {
public:
    int get(string& num, vector<int>& v){
        int index=0,ans=0;
        vector<int> vv;
        for(int i=num.length();i>=0;i--){
            if(index>=2) break;
            if(num[i]==v[index]){
                index++;
                vv.push_back(i);
            }
        }
        if(index<2) return 150;
        return num.length()-vv[0]+vv[0]-vv[1]-2;
    }

    bool haveZero(string& num){
        for(int i=0;i<num.length();i++){
            if(num[i]=='0')return true;
        }
        return false;
    }

    int minimumOperations(string num) {
        int ans=110;
        vector<vector<int>> v ={{'0','0'},{'0','5'},{'5','2'},{'5','7'}};
        for(int i=0;i<v.size();i++){
            int a = get(num, v[i]);
            ans=min(ans, a);
        }
        if(ans==110){
            if(haveZero(num)) return num.length()-1;
            return num.length();
        }
        return ans;
    }
};

后面两题目前还没有写!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值