力扣打卡day12

模拟题

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int findNthDigit(int n) {
        long long k=1,c=9,s=1;//k是第几位,c是k位数有几个,s是k位数的起点
        while(n>k*c){
            n-=k*c;
            k++,c*=10,s*=10;
        }
        s+=(n+k-1)/k-1;//看是k位数里面的第几个数
        n=n%k?n%k:k;//看是那个k位数的第几位
        return to_string(s)[n-1]-'0';
    }
};

floyd

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<double> calcEquation(vector<vector<string>>& e, vector<double>& v, vector<vector<string>>& q) {
        unordered_set<string> vers;
        unordered_map<string,unordered_map<string,double>> d;
        for(auto i=0;i<e.size();i++){
            auto a=e[i][0],b=e[i][1];
            auto c=v[i];
            d[a][b]=c,d[b][a]=1/c;
            vers.insert(a),vers.insert(b);
        }

        for(auto& k:vers)
            for(auto& i:vers)
                for(auto& j:vers){
                    if(d[i][k]&&d[j][k]){
                        d[i][j]=d[i][k]*d[k][j];
                    }
                }

        vector<double> res;
        for(auto& c:q){
            auto a=c[0],b=c[1];
            if(d[a][b]) res.push_back(d[a][b]);
            else res.push_back(-1);
        }
        return res;
    }
};

在这里插入图片描述

class Solution {
public:
    unordered_map<int,vector<int>> hash;
    Solution(vector<int>& nums) {
        for(auto i=0;i<nums.size();i++){
            hash[nums[i]].push_back(i);//拉链法
        }
    }
    
    int pick(int target) {
        return hash[target][rand()%hash[target].size()];
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * int param_1 = obj->pick(target);
 */

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    map<long long,int> dp;//防止遍历重复的
    int integerReplacement(int n) {
        return f(n);
    }

    long long f(long long n){
        if(dp[n]) return dp[n];
        if(n==1) return 0;
        if(n%2==0) return dp[n]=f(n/2)+1;
        return dp[n]=min(f(n+1),f(n-1))+1;
    }
};

水,sb题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        typedef long long LL;
        LL sum=0,cur=0;
        for(auto c:nums) sum+=c;//每一行减上一行都得这个和减去一个数
        int n=nums.size();
        for(int i=0;i<nums.size();i++) cur+=i*nums[i];//第一行是结果的基础
        LL res=cur;
        for(int i=n-1;i>=0;i--){
            cur+=sum-(LL)n*nums[i];
            res=max(res,cur);
        }
        return res;
    }
};

双指针

在这里插入图片描述

class Solution {
public:
    int K;
    unordered_map<char,int> cnt;

    void add(char c,int& x,int& y){
        if(!cnt[c]) x++;
        cnt[c]++;
        if(cnt[c]==K) y++;
    }

    void del(char c,int& x,int& y){
        if(cnt[c]==K) y--;
        cnt[c]--;
        if(!cnt[c]) x--;
    }
    
    int longestSubstring(string s, int _K) {
        K=_K;
        int res=0;
        for(int k=1;k<=26;k++){//有几个不同的字母
            cnt.clear();
            for(int i=0,j=0,x=0,y=0;i<s.size();i++){
                //i是右,j是左。x是i和j间不同字母的个数,y是满足条件的字母个数。
                add(s[i],x,y);
                while(x>k) del(s[j++],x,y);
                if(x==y) res=max(res,i-j+1);//都满足条件啊
            }
        }
        return res;
    }
};

dfs

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    string decodeString(string s) {
        int u=0;
        return dfs(s,u);
    }

    string dfs(string s,int& u){
        string res;
        while(u<s.size()&&s[u]!=']'){
            if(s[u]>='a'&&s[u]<='z'||s[u]>='A'&&s[u]<='Z') res+=s[u++];
            else if(s[u]>='0'&&s[u]<='9'){
                int k=u;
                while(s[k]>='0'&&s[k]<='9') k++;
                auto x=stoi(s.substr(u,k-u));
                u=k+1;//左括号
                auto y=dfs(s,u);
                u++;//右括号
                while(x--) res+=y;
            }
        }
        return res;
    }
};

模拟

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int get(int x,int y){
        return x>>y&1;
    }

    bool validUtf8(vector<int>& data) {
        for(int i=0;i<data.size();i++){
            if(!get(data[i],7)) continue;
            int k=0;
            while(k<=4&&get(data[i],7-k)) k++;
            //第一字节看看开头有几个1
            if(k>4||k==1) return false;
            for(int j=0;j<k-1;j++){
                int t=i+j+1;
                if(t>=data.size()) return false;
                if(!(get(data[t],7)&&!get(data[t],6))) return false;
                //该字符后面的字节
            }
            i+=k-1;//跳到下一个字符
        }
        return true;
    }
};

水题

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int k=0;
        for(auto c:t){
            if(k<s.size()&&c==s[k])
                k++;
        }
        return k==s.size();
    }
};

模拟题白给

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int lastRemaining(int n) {
        if(n==1) return 1;
        return 2*(n/2+1-lastRemaining(n/2));
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值