LeetCode 298场周赛

LeetCode 298场周赛

本次记录前三题解题思路。


一、兼具大小写的最好英文字母

给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。

最好 英文字母的大写和小写形式必须 都 在 s 中出现。

英文字母 b 比另一个英文字母 a 更好 的前提是:英文字母表中,b 在 a 之 后 出现。

示例1:

输入:s = "lEeTcOdE"
输出:"E"
解释:
字母 'E' 是唯一一个大写和小写形式都出现的字母。

示例2:

输入:s = "arRAzFif"
输出:"R"
解释:
字母 'R' 是大写和小写形式都出现的最好英文字母。
注意 'A''F' 的大写和小写形式也都出现了,但是 'R''F''A' 更好。

示例3:

输入:s = "AbCdEfGhIjK"
输出:""
解释:
不存在大写和小写形式都出现的字母。

提示:
1 <= s.length <= 1000
s 由小写和大写英文字母组成

解题思路&&代码块

两次遍历,第一次确立存在的小写字母,用flag数组存储。
第二次查找存在小写字母的大写字母,比较大小作为输出。
时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
public:
    string greatestLetter(string s) {
        string t;
        bool flag[26]={false};
        for(int i=0;i<s.length();i++){
            if(s[i]-'a'<26&&s[i]-'a'>=0){
                flag[s[i]-'a']=true;
            }
        }
        for(int i=0;i<s.length();i++){
            if(s[i]-'A'<26&&s[i]-'A'>=0){
                if(flag[s[i]-'A']){
                    if(t=="") t=s[i];
                    else{
                        if((s[i]-'A')>(t[0]-'A'))t=s[i];
                    }
                }
            }
        }
        return t;
    }
};

二、个位数字为 K 的整数之和

给你两个整数 num 和 k ,考虑具有以下属性的正整数多重集:

每个整数个位数字都是 k 。
所有整数之和是 num 。
返回该多重集的最小大小,如果不存在这样的多重集,返回 -1 。

注意:

多重集与集合类似,但多重集可以包含多个同一整数,空多重集的和为 0 。
个位数字 是数字最右边的数位。

示例1:

输入:num = 58, k = 9
输出:2
解释:
多重集 [9,49] 满足题目条件,和为 58 且每个整数的个位数字是 9 。
另一个满足条件的多重集是 [19,39] 。
可以证明 2 是满足题目条件的多重集的最小长度。

示例2:

输入:num = 37, k = 2
输出:-1
解释:个位数字为 2 的整数无法相加得到 37

示例3:

输入:num = 0, k = 7
输出:0
解释:空多重集的和为 0

提示:
0 <= num <= 3000
0 <= k <= 9

解题思路&&代码块

动态规划,简化背包问题,类似题目可以参考Google面试题:K数之和,本题更简单,需要注意判断条件。
当然根据k范围为0~9,有暴力解法,此处不表。
时间复杂度:O(num)

class Solution {
public:
    int as=2147483647;
    bool find(vector<int> v,int all,int sum){
        if(all==0) return true;
        if(all<0||sum>as) return false;
        for(int i=v.size()-1;i>=0;i--){
            if(all-v[i]<0) continue;
            bool flag=find(v,all-v[i],sum+1);
            if(flag==true){
                if(sum<as) as=sum;
                break;
            }
            else{
                if(as!=2147483647) break;
                else continue;
            }
        }
        return false;
    }
    int minimumNumbers(int num, int k) {
        vector<int>v;
        if(num==0||(num==0&&k==0)) return 0;
        if(num%10==k) return 1;
        if(num<k) return -1;
        //特殊情况,k为偶数相加不可能为奇数;k为5/0则和末尾为5/0
        if(k%2==0&&num%2!=0) return -1;
        if(k%5==0&&num%5!=0) return -1;
        if(k==0&&num%10!=0) return -1;
        int cs=0;
        for(int i=1;i<=num;i++){
            if(i%10==k){
                v.push_back(i);
            }
        }
        if(v.empty()) return -1;
        find(v,num,1);
        if(as==2147483647) return -1;
        return as;   
    }
};

三、小于等于 K 的最长二进制子序列

给你一个二进制字符串 s 和一个正整数 k 。

请你返回 s 的 最长 子序列,且该子序列对应的 二进制 数字小于等于 k 。

注意:

子序列可以有 前导 0 。
空字符串视为 0 。
子序列 是指从一个字符串中删除零个或者多个字符后,不改变顺序得到的剩余字符序列。

示例1:

输入:s = "1001010", k = 5
输出:5
解释:s 中小于等于 5 的最长子序列是 "00010" ,对应的十进制数字是 2 。
注意 "00100""00101" 也是可行的最长子序列,十进制分别对应 45 。
最长子序列的长度为 5 ,所以返回 5

示例2:

输入:s = "00101001", k = 1
输出:6
解释:"000001" 是 s 中小于等于 1 的最长子序列,对应的十进制数字是 1 。
最长子序列的长度为 6 ,所以返回 6

提示:
1 <= s.length <= 1000
s[i] 要么是 ‘0’ ,要么是 ‘1’ 。
1 <= k <= 10^9

解题思路&&代码块

先找出字符串中0的个数,然后从低位到高位的顺序尝试插入1,判断插入后子序列对应的二进制数是否大于k。
注意题目所给k为int型,超过32位的数不用考虑。
时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
public:
    int longestSubsequence(string s, int k) {
        long long all=0;
        long long pp=0;
        for(int i=s.length()-1;i>=0;i--){
            if(s[i]=='0') all++;
            else if(s.length()-1-i<30){
                pp+=pow(2,s.length()-1-i);
                if(pp<=k) all++;
            }
        }
        return all;
    }
};

总结

虽不能至,心向往之。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值