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