算法练习(3)

题目一:长按键入(难度:简单)

你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/long-pressed-name

思路:首先把字符不相同或者typed字符串长度小于名字的直接返回false。其他情况通过双指针,分别遍历两个字符串,看typed中重复的字符数是否大于或等于name中重复相同的字符数;若不是则返回false。最后再看name的指针是否全部遍历了字符串;如果没有,说明typed中缺少了字符。

class Solution {
public:
    bool isLongPressedName(string name, string typed) {
        int j=0,indexA=0,indexB=0;
        for(int i=0;i<typed.length();){
            if(typed[i]!=name[j]||typed.length()<name.length())
                return false;
            while(typed[i]==name[j]){
                i++;indexA++;
            }
            while(name[j]==typed[i-1]){
                j++;indexB++;
            }
            if(indexA<indexB)return false;
            else {
                indexA=0;indexB=0;
            }
        }
        if(j<name.length())return false;
        return true;
    }
};

题目二:赎金信(难度:简单)

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ransom-note

思路:两次循环分别遍历ransomNote和magazine,逐个字符对比。如果在magazine中有该字符计数自加1,并将magazine中该字符的值改为'0',如果没有直接返回false。循环结束后,查看index的值是否是ransomNote的长度,如果是返回true,否则为false。

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int index=0,j;
        for(int i=0;i<ransomNote.length();i++){
            for(j=0;j<magazine.length();j++){
                if(magazine[j]==ransomNote[i]){
                    index++;
                    magazine[j]='0';
                    break;
                }
            }
            if(j==magazine.length()) return false;
        }
        if(index==ransomNote.length()) return true;
        return false;
    }
};

题目三:猜数字大小(难度:简单)

猜数字游戏的规则如下:

每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
返回我选出的数字

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower

思路:直接通过二分查找就可解决

class Solution {
public:
    int guessNumber(int n) {
        long long int low=0,high=n;
        while(low<=high){
            long long int mid=(high+low)/2;
            if(guess(mid)==0) return mid;
            else if(guess(mid)==1) low=mid+1;
            else if(guess(mid)==-1) high=mid-1;
        }
        return 0;
    }
};

题目四:适合打劫银行的日子(难度:中等)

你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。

如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子:

第 i 天前和后都分别至少有 time 天。
第 i 天前连续 time 天警卫数目都是非递增的。
第 i 天后连续 time 天警卫数目都是非递减的。
更正式的,第 i 天是一个合适打劫银行的日子当且仅当:security[i - time] >= security[i - time + 1] >= ... >= security[i] <= ... <= security[i + time - 1] <= security[i + time].

请你返回一个数组,包含 所有 适合打劫银行的日子(下标从 0 开始)。返回的日子可以 任意 顺序排列。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-good-days-to-rob-the-bank

思路:先判断security容器中的长度是否有time的2倍加1,如果没有直接返回空容器n。然后去循环security容器判断内部元素是否全部相同,如果全部相同就可直接通过time的值直接返回相应的下标。否则,通过双重循环去遍历security容器,把符合条件的元素的下标存入n容器中。最后返回容器n即可。

class Solution {
public:
    vector<int> goodDaysToRobBank(vector<int>& security, int time) {
        vector<int> n;int j,flag=0;
        if(size(security)<time*2+1) return n;
        for(int i=0;i<size(security)-1;i++){
            if(security[i]!=security[i+1]){
                flag=1;break;
            }
        }
        if(flag==1)
            for(int i=time;i<size(security)-time;i++){
                for(j=i-time;j<i;j++){
                    if(security[j+1]>security[j]) break;
                }
                if(j==i)
                    for(;j<i+time;j++){
                        if(security[j]>security[j+1]) break;
                    }
                if(j==i+time) n.push_back(i);
            }
        else {
            for(int i=time;i<size(security)-time;i++){
                n.push_back(i);
            }
        }
        return n;
    }
};

题目五:最大单词长度乘积(难度:中等)

给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-word-lengths

思路:遍历words字符串容器中的每一对字符串,通过位运算来判断两个单词是否有公共字符,将其存入n容器中。之后通过双重循环判断”n[i]&n[j]“是否等于0来看是否有公共字符。如果没有,判断这一对字符串的长度是否大于max来更新max。

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int length=size(words),max=0;
        vector<int> n(length);
        for(int i=0;i<length;i++){
            string word=words[i];
            for(int j=0;j<size(word);j++){
                n[i]=n[i]|1<<(word[j]-'a');
            }
        }
        for(int i=0;i<length;i++){
            for(int j=i+1;j<length;j++){
                if((n[i]&n[j])==0){
                    if(max<(size(words[i])*size(words[j])))
                        max=size(words[i])*size(words[j]);
                }
            }
        }
        return max;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值