题解:暴力枚举把字符串中的数字筛选出来,用数据结构去重即可(set,map,hashmap)均可
代码如下:
class Solution {
public:
int numDifferentIntegers(string word) {
set<string> se;
string cur="";
bool zero=false;
for(int i=0;i<int(word.size());i++)
{
if(word[i]>='0'&&word[i]<='9')
{
if(cur==""&&word[i]=='0')
{
zero=true;
continue;
}
zero=false;
cur+=word[i];
} else {
if(zero)
{
se.insert("0");
zero=false;
}
if(cur!="")
{
se.insert(cur);
cur="";
}
}
}
if(zero)
{
se.insert("0");
zero=false;
}
if(cur!="")
{
se.insert(cur);
cur="";
}
return int(se.size());
}
};
题解:暴力模拟即可,更简单的方法,不用模拟所有数字,只需要枚举数字1回到位置1用了多少步就行了,代码如下:
class Solution {
public:
int reinitializePermutation(int n) {
int ret=1;
int cur=n/2;
while(cur!=1)
{
if(cur%2==0)
cur/=2;
else
cur=n/2+(cur-1)/2;
ret++;
}
return ret;
}
};
题解:用数据结果map或hashmap存储下映射关系,模拟即可
class Solution {
public:
string evaluate(string s, vector<vector<string>>& knowledge) {
unordered_map<string,string> mp;
for(int i=0;i<int(knowledge.size());i++)
{
mp[knowledge[i][0]]=knowledge[i][1];
}
string ret="";
for(int i=0;i<int(s.size());i++)
{
if(s[i]=='(')
{
string tem="";
for(i=i+1;i<int(s.size());i++)
{
if(s[i]==')')
{
if(mp.find(tem)==mp.end())
{
ret+="?";
} else {
ret+=mp[tem];
}
break;
}
tem+=s[i];
}
} else {
ret+=s[i];
}
}
return ret;
}
};
题解:问题可以抽象为,把一个正整数,分解任意
个整数
,求这
个数的乘积最大为多少?答案模以
。
我们定义为
分解后乘积的最大值。
我们可以观察:
,分解为单个数
,分解为单个数
,分解为单个数
,分解为
,分解为
,分解为
,分解为
,分解为
,分解为
我们可以观察到,
当时:假设我们首先分解为两个数
,
当的时候,我们一定会继续往下分解直到
即
,显然1对于最后乘积变大没有意义,所以
同理。
所以最后一定是分解为若干个3加若干个2。
由于
所以最后一定是分解为若干3加(0或1或2)个2之和,这样
的值最大。
利用快速幂进行计算即可。
代码如下:
class Solution {
public:
long long POW(long long x,long long y,long long mo)
{
long long ret=1;
x%=mo;
while(y)
{
if(y&1)
ret=(ret*x)%mo;
x=(x*x)%mo;
y>>=1;
}
return ret;
}
int maxNiceDivisors(int primeFactors) {
if(primeFactors==1)
return 1;
else if(primeFactors==2)
return 2;
int l=1,r=primeFactors;
int mo=1000000007;
int N3=primeFactors/3;
if(primeFactors%3==1)
{
return (POW(3,N3-1,mo)*4)%mo;
} else if(primeFactors%3==2){
return (POW(3,N3,mo)*2)%mo;
}
return POW(3,N3,mo);
}
};