leetcode 234周赛

链接:🏆 第 234 场力扣周赛 - 力扣(LeetCode) (leetcode-cn.com)

题目一:

字符串中不同整数的数目

题目及示例:

给你一个字符串 word ,该字符串由数字和小写英文字母组成。

请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123  34 8  34"
注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123""34""8""34" 。 返回对 word 完成替换后形成的 不同 整数的数目。 只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。   示例 1: 输入:word = "a123bc34d8ef34" 输出:3 解释:不同的整数有 "123""34""8" 。注意,"34" 只计数一次。 示例 2: 输入:word = "leet1234code234" 输出:2 示例 3: 输入:word = "a1b01c001" 输出:1 解释:"1""01""001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。   提示: 1 <= word.length <= 1000 word 由数字和小写英文字母组成

  代码:

class Solution {
public:
    int numDifferentIntegers(string word) {
    unordered_map<string, int>c;
    string a;
    for (int i = 0;i < word.length();i++)
    {
        if (word[i] >= '0' && word[i] <= '9')
        {
            a.push_back(word[i]);
            if (i != word.length() - 1)
                continue;
        }

        for (int x = 0;x < a.length();x++)
        {
            if (a[x] == '0'&&a.size()>1)
            {
                a.erase(a.begin());
                x--;
            }
            else break;

        }
        if (a.compare("") != 0)
            c[a]++;
        a.clear();
    }
        return c.size();
    }
};

 

 

题目二:

还原排列的最少操作步数

题目及示例:

给你一个偶数 n​​​​​​ ,已知存在一个长度为 n 的排列 perm ,其中 perm[i] == i​(下标 从 0 开始 计数)。

一步操作中,你将创建一个新数组 arr ,对于每个 i :

如果 i % 2 == 0 ,那么 arr[i] = perm[i / 2]
如果 i % 2 == 1 ,那么 arr[i] = perm[n / 2 + (i - 1) / 2]
然后将 arr​​ 赋值​​给 perm 。

要想使 perm 回到排列初始值,至少需要执行多少步操作?返回最小的 非零 操作步数。

 

示例 1:

输入:n = 2
输出:1
解释:最初,perm = [0,1]
第 1 步操作后,perm = [0,1]
所以,仅需执行 1 步操作
示例 2:

输入:n = 4
输出:2
解释:最初,perm = [0,1,2,3]
第 1 步操作后,perm = [0,2,1,3]
第 2 步操作后,perm = [0,1,2,3]
所以,仅需执行 2 步操作
示例 3:

输入:n = 6
输出:4
 

提示:

2 <= n <= 1000
n​​​​​​ 是一个偶数

解题思路

一个数组从原数组开始变换,最后变成本身。

故只需要递归模拟变换即可。

代码

class Solution {
public:
int ans = 1;
void func(int flag,int n)
{

    if (flag % 2)
    {
        flag = n / 2 + (flag - 1) / 2;
    }
    else
    {
        flag = flag / 2;
    }
    if (flag == 1)
        return;
    else func(flag,n);
    ans++;
}
    int reinitializePermutation(int n) {
    func(1,n);
    return ans;
    }
};

 

 

 

题目三 :

替换字符串中的括号内容

题目及示例:

给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。

比方说,字符串 "(name)is(age)yearsold" 中,有 两个 括号对,分别包含键 "name" 和 "age" 。
你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。

你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:

将 keyi 和括号用对应的值 valuei 替换。
如果从 knowledge 中无法得知某个键对应的值,你需要将 keyi 和括号用问号 "?" 替换(不需要引号)。
knowledge 中每个键最多只会出现一次。s 中不会有嵌套的括号。

请你返回替换 所有 括号对后的结果字符串。

 

示例 1:

输入:s = "(name)is(age)yearsold", knowledge = [["name","bob"],["age","two"]]
输出:"bobistwoyearsold"
解释:
键 "name" 对应的值为 "bob" ,所以将 "(name)" 替换为 "bob" 。
键 "age" 对应的值为 "two" ,所以将 "(age)" 替换为 "two" 。
示例 2:

输入:s = "hi(name)", knowledge = [["a","b"]]
输出:"hi?"
解释:由于不知道键 "name" 对应的值,所以用 "?" 替换 "(name)" 。
示例 3:

输入:s = "(a)(a)(a)aaa", knowledge = [["a","yes"]]
输出:"yesyesyesaaa"
解释:相同的键在 s 中可能会出现多次。
键 "a" 对应的值为 "yes" ,所以将所有的 "(a)" 替换为 "yes" 。
注意,不在括号里的 "a" 不需要被替换。
示例 4:

输入:s = "(a)(b)", knowledge = [["a","b"],["b","a"]]
输出:"ba"
 

提示:

1 <= s.length <= 105
0 <= knowledge.length <= 105
knowledge[i].length == 2
1 <= keyi.length, valuei.length <= 10
s 只包含小写英文字母和圆括号 '(' 和 ')' 。
s 中每一个左圆括号 '(' 都有对应的右圆括号 ')' 。
s 中每对括号内的键都不会为空。
s 中不会有嵌套括号对。
keyi 和 valuei 只包含小写英文字母。
knowledge 中的 keyi 不会重复。

 

题目分析:

本题特别卡时间,只允许遍历一遍,所以忌图方便用find函数。

代码:

class Solution {
public:
    string evaluate(string s, vector<vector<string>>& knowledge) {
        unordered_map<string, string>hs;
    for (vector<string>x : knowledge)
    {
        hs[x[0]] = x[1];
    }
    int idx1, idx2, num;
    string str, ans;
    for (int idx1 = 0;idx1 < s.length();idx1++)
    {
        if (s[idx1] != '(')
        {
            ans.push_back(s[idx1]);
            continue;
        }
        while (s[idx1 + 1] != ')')
        {
            str.push_back(s[++idx1]);
        }
        if (hs.count(str))
            ans += hs[str];
        else
            ans += "?";
        idx1++;
        str.clear();
    }
    return ans;
    }
};

 

 

题目四:

好因子的最大数目

题目描述及示例:

给你一个正整数 primeFactors 。你需要构造一个正整数 n ,它满足以下条件:

n 质因数(质因数需要考虑重复的情况)的数目 不超过 primeFactors 个。
n 好因子的数目最大化。如果 n 的一个因子可以被 n 的每一个质因数整除,我们称这个因子是 好因子 。比方说,如果 n = 12 ,那么它的质因数为 [2,2,3] ,那么 6 和 12 是好因子,但 3 和 4 不是。
请你返回 n 的好因子的数目。由于答案可能会很大,请返回答案对 109 + 7 取余 的结果。

请注意,一个质数的定义是大于 1 ,且不能被分解为两个小于该数的自然数相乘。一个数 n 的质因子是将 n 分解为若干个质因子,且它们的乘积为 n 。

 

示例 1:

输入:primeFactors = 5
输出:6
解释:200 是一个可行的 n 。
它有 5 个质因子:[2,2,2,5,5] ,且有 6 个好因子:[10,20,40,50,100,200] 。
不存在别的 n 有至多 5 个质因子,且同时有更多的好因子。
示例 2:

输入:primeFactors = 8
输出:18
 

提示:

1 <= primeFactors <= 109

 

题目分析:

本题分析:

「欢迎收藏」详细数学推导:如何转化、如何求解(附Java代码) - 好因子的最大数目 - 力扣(LeetCode) (leetcode-cn.com)

 

代码:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
LL qmi(LL x, LL k)
{
    LL res = 1;
    while (k)
    {
        if (k & 1) 
            res = res * x % mod;
        x = x * x % mod;
        k >>= 1;
    }
    return res;
}
int main()
{
    int primeFactors = 10;
    if (primeFactors <= 3) cout << primeFactors;
    if (primeFactors % 3 == 0)
        cout << qmi(3, primeFactors / 3);
    if (primeFactors % 3 == 2)
        cout << qmi(3, primeFactors / 3) * 2 % mod;
    else
        cout << qmi(3, primeFactors / 3 - 1) * 4 % mod;
}

 

posted @ 2021-03-29 20:33  Carrout  阅读(139)  评论(0编辑  收藏  举报