5713.字符串中不同整数的数目
模拟
把数字提取出来,去除前导0后放入set中,最后返回set的大小
class Solution {
public:
int numDifferentIntegers(string s) {
set<string>st;
int n=s.size();
int i=0;
for(int i=0;i<n;i++)
{
if(s[i]<'0' || s[i]>'9') {
continue;
}
else{
int j=0;
string t;
for(j=i; j<n && (s[j]>='0' && s[j]<='9');j++)
{
t+=s[j];
}
string v;
int z;
for(z=0;z<t.size()&&t[z]=='0';z++);
for(int k=z;k<t.size();k++)
v+=t[k];
i=j-1;
st.insert(v);
}
}
return st.size();
}
};
5715.还原排列的最少操作步数
模拟
数据量只有1000,O(n²)可以过
class Solution {
public:
int reinitializePermutation(int n) {
vector<int>a(n);
for(int i=0;i<n;i++)
a[i]=i;
int res=1;
while(1){
int k=1;
for(int i=0;i<n;i++)
{
if(a[i]&1){
a[i]=n/2+(a[i]-1)/2;
}
else
a[i]/=2;
}
for(int i=0;i<n;i++){
if(a[i]!=i) {
res++;
k=0;
break;
}
}
if(k)break;
}
return res;
}
};
5714. 替换字符串中的括号内容
模拟
把knowledge数组放入set中用来查询
class Solution {
public:
string evaluate(string s, vector<vector<string>>& kno) {
map<string,string>mp;
for(auto &c : kno){
mp[c[0]]=c[1];
}
string res;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
{
string t;
int j=i+1;
for(j=i+1;j<s.size();j++)
{
if(s[j]==')') break;
t+=s[j];
}
if(mp.find(t)!=mp.end()){
res+=mp[t];
}
else res+="?";
i=j;
}
else res+=s[i];
}
return res;
}
};
5716.好因子的最大数目
数学+快速幂
题目转化为:求几个数和为n的最大乘积。
有详细证明数字为3时乘积最大的,所以数字3尽可能多,如果n%3==1,则分解为(n-1)个3和一个4,如果n%3==2,则分解为n-1个3和一个2
class Solution {
public:
const int mod = 1e9+7;
long long fastPow(long long a, long long n){
long base = a;
long res = 1;
while(n){
if(n&1)
res=(base * res) % mod;
n/=2;
base = (base * base) % mod;
}
return res;
}
int maxNiceDivisors(int n) {
long long res;
if(n<=3) return n;
if(n%3==0)
res=fastPow(3,n/3)%mod;
else if(n%3==1)
res=fastPow(3,(n-4)/3)*4%mod;
else if(n%3==2)
res=fastPow(3,n/3)*2%mod;
return res;
}
};