0
点赞
收藏
分享

微信扫一扫

算法练习(3)

钟罗敏 2022-03-12 阅读 95

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

思路:首先把字符不相同或者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,逐个字符对比。如果在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;
    }
};

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

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

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;
    }
};

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

思路:先判断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字符串容器中的每一对字符串,通过位运算来判断两个单词是否有公共字符,将其存入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 条评论