力扣268周周赛

力扣268周周赛


1.

https://leetcode-cn.com/problems/two-furthest-houses-with-different-colors/

数据范围这么小,直接暴力:
class Solution {
public:
    int ans=-1;
    int maxDistance(vector<int>& colors) {
        for(int i=0;i<colors.size();i++){
            for(int j=i;j<colors.size();j++){
                if(colors[i]!=colors[j]) ans=max(ans,j-i);
            }
        }
        return ans;
    }
};

2.

有点麻烦的模拟题,我竟然花了20分钟左右才做出来,好菜啊QAQ

https://leetcode-cn.com/problems/watering-plants/

class Solution {
public:
    int ans=0;
    int wateringPlants(vector<int>& p, int c) {
        int i=0;
        int cc=c;

        while(i<p.size()){
            c-=p[i];
            ans++;
            if(i+1<p.size()&&c<p[i+1]) {
                ans+=i+1; //回到水渠 
                c=cc;        
                ans+=i+1; //走到植物的位置
            }
            i++;
        }
       return ans;
    }
};

3.

https://leetcode-cn.com/problems/range-frequency-queries/submissions/

题目问的是给定区间内某个数字出现的次数,观察数据发现,数字最大不过10^4,因此用一个哈希表来存vector,vector里存该数字出现的下标,要查某个数字n时,直接去哈希表vs[n]中去查就可以了
class RangeFreqQuery {
public:
    vector<int> vs[10010];
    RangeFreqQuery(vector<int>& arr) {
        for(int i=0;i<arr.size();i++)
           vs[arr[i]].push_back(i);
      
    }
    
    int query(int left, int right, int value) {
        auto d=lower_bound(vs[value].begin(),vs[value].end(),left); //大于等于left的值
        auto u=upper_bound(vs[value].begin(),vs[value].end(),right); //大于right的值
        return u-d;
    }
};

https://leetcode-cn.com/problems/sum-of-k-mirror-numbers/

只要看明白问题就比较简单了,需要枚举出所有的十进制回文串,将其转换为K进制,判断K进制串是否是回文串即可。
需要解决三个问题 1.如何获取下一个十进制回文串 2. 如何将十进制转k进制 3.如何判断一个串是否是回文串
2 3 都比较好解决,只讲1怎么实现

假设我们有了一个回文串为 101 , 则我们把串拆成两部分, 10 和 1,10++ 变为 11 ,然后再把11复制到右半部分变成111,就是我们的下一个十进制回文串了。 另外,对于99这种情况要特判,如果一个串全是9,那么下一个串一定是10…(n-1个0)…01,n为输入的回文串的长度

class Solution {
public:
    // 1. 已知一个十进制数字,求下一个
    /*
    取前 (n+1)/2位出来,n代表数字的位数
    取出来的数字记为x
    将x+1作为新的回文串,把x+1复制到串另一边去即可
    */
    long long s_ll(string s){
       long long v=0;
        for(int i=0;i<s.length();i++)
            v=v*10+s[i]-'0';
        return v;
    }

    string ll_s(long long n){
        string res="";
        while(n){
            res+=n%10+'0';
            n/=10;
        }
        reverse(res.begin(),res.end());
        return res;
    }

    string nxt_hw(string s){
        string res="";
        string sub=s.substr(0,(s.length()+1)>>1);

        int flag=1;
        for(auto it:sub)
            if(it!='9') {flag=0;break;}
            
        string nxt=ll_s(s_ll(sub)+1);
        // 若原串全是9,则下一个串长度+1,反之长度不变
        if(flag){
            nxt="";
            for(int i=0;i<=s.length();i++){
                if(i==0||i==s.length())
                nxt+='1';
                else nxt+='0';
            }
        }else{
            int p=nxt.length()-2;
            if(!(s.length()%2)) nxt+=nxt.back();
            for(;p>=0;p--)
            nxt+=nxt[p];
        }
        return nxt;
    }

    // 2.判断字符串是否回文
    bool is_hw(const string &s){
        for(int i=0;i<s.length()/2;i++)
        if(s[i]!=s[s.length()-i-1]) return false;
        return true;
    }
    // 3. 十进制转k进制
    string get_k(string s,int k){
        long long v=0;
        for(int i=0;i<s.length();i++)
            v=v*10+s[i]-'0';
        string res="";
        while(v){
            res+=v%k+'0';
            v/=k;
        }
        return res;
    }

    long long kMirror(int k, int n) {
        long long sm=0;
        string st="1";
        while(n--){
            if(!is_hw(get_k(st,k))) n++;
            else sm+=s_ll(st);
            st=nxt_hw(st);
        }
        return sm;      
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值