题目链接: Leetcode Weekly Contest 234
写在前面:
本次周赛难度不大,但只做出了前两题,第三题在比赛结束后做出来了,手速还需提高。
1、1805. Number of Different Integers in a String
难度:Easy
题目大意:
将字符串中的字母有空格代替,如何以空格作为间隔将字符串中的数字分隔开,求字符串中有多少个不同的数值。012和12表示的数值相同。比较无聊的一道题,没那么容易做,磨了快半小时,写的代码比较丑。
思路:
按照题意一步步模拟。
代码
class Solution {
public int numDifferentIntegers(String word) {
StringBuilder sb=new StringBuilder(word);
for(int i=0;i<sb.length();i++){
if(sb.charAt(i)>='a'&&sb.charAt(i)<='z'){
sb.setCharAt(i,' ');
}
}
String s1=sb.toString();
s1=s1.trim();//去除首尾空格
if(s1.length()==0){
return 0;
}
String[] strArr=s1.split("\\s+");//把空格都去掉
Set<Integer> set=new HashSet<>();
for(String s:strArr){
int sum=0;
int len=s.length();
int p=0;
while(p<len&&s.charAt(p)=='0'){
p++;
}
for(int i=p;i<len;i++){
int a=s.charAt(i)-'0';
sum=sum*10+a;
}
set.add(sum);
}
return set.size();
}
}
2、1806. Minimum Number of Operations to Reinitialize a Permutation
难度:Medium
题目大意:
详见题目。
思路:
找规律,追踪数字1的下标即可。
代码
class Solution {
public int reinitializePermutation(int n) {
int count=0;
int half=n/2;
int i=1;//追踪1的下标
if(n==2){
return 1;
}
i=i*2;
count++;
while(i!=1){
if(i<half){
i=i*2;
count++;
}
else{
i=1+2*(i-half);
count++;
}
}
return count;
}
}
3、1807. Evaluate the Bracket Pairs of a String
难度:Medium
题目大意:
给出一个字符串和二维数组,二维数组中每个元素含有两个字符串,分别表示key和对应的value,将字符串中括号内的key用相应的value代替。
思路:
按照题意一步步模拟即可。
代码
class Solution {
public String evaluate(String s, List<List<String>> knowledge) {
Map<String,String> map=new HashMap<>();
for(List<String> l:knowledge){
map.put(l.get(0),l.get(1));
}
StringBuffer sb=new StringBuffer(s);
int i=0;
while(i<sb.length()){
while(i<sb.length()&&sb.charAt(i)!='('){
i++;
}
if(i>=sb.length()){
break;
}
int left=i;
while(i<sb.length()&&sb.charAt(i)!=')'){
i++;
}
int right=i;
String s1=sb.substring(left+1,right);
if(map.containsKey(s1)){
String value=map.get(s1);
sb.replace(left,right+1,value);
//替换后sb的长度会发生变化,所以要更新i的位置
int diff=(right-left+1)-value.length();
i=i-diff;
i++;
}
else{
sb.replace(left,right+1,"?");
int diff=(right-left+1)-1;
i=i-diff;
i++;
}
}
return sb.toString();
}
}
}
4、1808. Maximize Number of Nice Divisors
难度:Hard
题目大意:
详见题目。
思路
参考高赞回答。是一道数学题,与leetcode343类似。
代码
class Solution {
public int maxNiceDivisors(int primeFactors) {
int n=primeFactors;
int M=1000000007;
int a=n/3,b=n%3;//a=3*a+b
if(n<=3){
return n;
}
long res=0;
if(b==0){
res=quickPow(3,a);
}
else if(b==1){
res=quickPow(3,a-1)*4%M;
}
else{
res=quickPow(3,a)*2%M;
}
return (int)res%M;
}
public long quickPow(long x,int n){//Leetcode50,求pow(x,n)
int M=1000000007;
long ans=1;
while(n>0){
if(n%2==1){
ans=ans*x;
ans=ans%M;//运算过程中取模,防止溢出
}
x=x*x;
x=x%M;
n/=2;
}
return ans;
}
}