力扣第303场周赛 + AcWing第61场周赛补题

力扣

一.第一个出现两次的字母

1.原题链接:力扣

2.解题思路:

        先开个数组arr,将数组内的各元素赋初值为0,接着遍历字符串s,将a~z用各对应的数字0~26表示,并作为下标每次对数组arr内的元素加一,若arr数组内有元素最先等于2,则说明出现了第一个出现两次的字母,此时输出这个字母即s[i] 即可

3.参考代码:

class Solution {
public:
    char repeatedCharacter(string s) {
        int arr[26];
        for(int i = 0; i < 26; i++)arr[i] = 0;
        for(int i = 0; i < s.size(); i++){
            ++arr[s[i] - 'a'];
            if(arr[s[i] - 'a'] == 2)return s[i];
        }
        return 0;
    }
};

二.相等行列对

1.原题链接:力扣

2.解题思路:

        先申请一个矩阵vec用来存储矩阵grid的转置结果,接着比较两个矩阵的行相等的有多少,数量用ans表示,输出ans即可

3.参考代码:

class Solution {
public:
    int equalPairs(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<vector<int>>vec(n, vector<int>(n));
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                vec[i][j] = grid[j][i];
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(grid[i] == vec[j])ans++;
            }
        }
        return ans;
    }
};

AcWing

一.分糖果

1.原题链接:4497. 分糖果 - AcWing题库

2.解题思路:

        先输入T,表示有T组数据。接着再输入数据a,b,c,输出(a+b+c)/ 2即可

        注意:数据范围较大,开long long

3.参考代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int T;
    cin >> T;
    long long int a, b , c;
    while(T--){
        cin >> a >> b >> c;
        cout << (a + b + c) / 2 << endl;
    }
    return 0;
}

二.指针

1.原题链接:4498. 指针 - AcWing题库

2.解题思路:

        二进制枚举法。在2的n次方内进行枚举,每次是按位枚举一个二进制数,第j位上的数为1则代表的j个转动的角度是向右的,否则为0就是向左,最后得到距离原点的偏移量,如果还在原点,则偏移量是360的倍数,此时输出YES,否则输出NO

3.参考代码:

#include <iostream>

using namespace std;

const int N = 20, M = 1 << 16;
int n;//有几次操作
int a[N];//每次移动的度数
int f[M];//记录结果,也可以用一个int,每次枚举初始化为0就可

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin>>a[i];
    for(int i = 0; i <= 1 << n; i++)//枚举2进制数
    {
        for(int j = 0; j < n; j++)//枚举每一位
        if(i >> j & 1) //看第j位上是否为1
        f[i] += a[j];//向右就+
        else f[i] -= a[j];//向左就-

        if(f[i] % 360 == 0)//是否在原点
        {
            cout << "YES" << endl;
        return 0;
        }
    }
    cout << "NO" << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值