力扣
一.第一个出现两次的字母
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;
}